单例模式(懒汉式和饿汉式)

这篇具有很好参考价值的文章主要介绍了单例模式(懒汉式和饿汉式)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概念

单例模式是指保证某个类在整个软件系统中只有一个对象实例,并且该类仅提供一个返回其对象实例,由于单例模式在内存中只有一个实例,减少了内存开支,特别是一个对象需要频繁地创建、销毁时,而且创建或销毁时性能又无法优化,单例模式的优势就非常明显。

在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。选择单例模式是为了避免不一致状态。

单例常见方式

饿汉式(线程安全)

饿汉就是类一旦加载,单例初始化就开始,保证在调用getInstance()方法时,单例是已经存在的了,以后不再改变,所以是线程安全的。
缺点:当类装载的时候就会创建类的实例,不管你用不用,都会先创建出来,无法做到延迟创建对象,从而降低内存的使用率。

/*
饿汉单例模式设计:
①使用private修饰构造函数,限制了外部创建该类对象
②创建一个静态的对象,在类初始化时,已经自行实例化。
③声明一个getInstance方法来返回该静态对象
*/
public class SingletonPattern {
  private static final SingletonPattern single=new SingletonPattern();
  private SingletonPattern(){}
  static public SingletonPattern getInstance(){
  return single;
   }
}

懒汉式(线程不安全)

懒汉模式中,在第一次调用的时候实例化自己,也就是说只有当调用getInstance()的时候,并且判断 instance为null时才创建一个实例。被动地创建实例。

/*设计:
①构造函数私有,避免外部创建对象(但是Java反射机制是能够实例化构造方法为private的类的,会使Java单例实现失效)
②声明当前类的引用,此时不能对引用进行实例化
③声明getInstance()方法,懒汉式单例的实现没有考虑线程安全问题,	它是线程不安全的,并发环境下可能出现多个实例,要保证线程安全,可以使用 synchronized将方法声明为同步方法,双重检查锁定,或者静态内部类,根据当前对象判断是否为null来创建对象。
*/

线程不安全的懒汉式

public class SingletonPattern2 {
    private static SingletonPattern2 singe=null;
    private SingletonPattern2(){}
    public  static SingletonPattern2 getInstance(){
       if (singe==null){
           singe=new SingletonPattern2();
       }
        return singe;
    }
}

线程安全的懒汉式

1、在getInstance方法上加同步

public class SingletonPattern2 {
    private static SingletonPattern2 singe=null;
    private SingletonPattern2(){}
    public synchronized static SingletonPattern2 getInstance(){
       if (singe==null){
           singe=new SingletonPattern2();
       }
        return singe;
    }
}

2、双重检查锁定

public class SingletonPattern2 {
    private static SingletonPattern2 singe=null;
    private SingletonPattern2(){}
    public synchronized static SingletonPattern2 getInstance(){
        if (singe==null){
            synchronized (SingletonPattern2.class){
                if (singe==null){
                    singe=new SingletonPattern2();
                }
            }
        }
        return singe;
    }
}

3、静态内部类

public class SingletonPattern2 {
    private SingletonPattern2(){}
    public static class LazyHolder{
        private static SingletonPattern2 singe=new SingletonPattern2();
    }
    public  static SingletonPattern2 getInstance() {
        return LazyHolder.singe;
    }
}

测试

public class Test {
public static void main(String[] args) {
//饿汉式(线程安全)
SingletonPattern instance =SingletonPattern.getInstance();
SingletonPattern instance2 =SingletonPattern.getInstance();
//判断是否是一个对象实例
System.out.println(instance==instance2);//true

//懒汉式(线程不安全)
SingletonPattern2 instance3 =SingletonPattern2.getInstance();
SingletonPattern2 instance4 =SingletonPattern2.getInstance();
//判断是否是一个对象实例
System.out.println(instance3==instance4);//true
  }
}

懒汉式和饿汉式区别

饿汉式天生就是线程安全的,可以直接用于多线程而不会出现问题,

懒汉式本身是非线程安全的,为了实现线程安全有以上几种写法。

懒汉模式和饿汉模式的实例创建的时机不同;

单例模式的应用场景

某类只要求生成一个对象的时候,如一个班中的班主任。

单例模式为一个面向对象的应用程序提供对象惟一的访问点,整个应用程序同享一个实例对象。

某类需要频繁实例化,而创建的对象又频繁被销毁的时候,如多线程的线程池文章来源地址https://www.toymoban.com/news/detail-548879.html

到了这里,关于单例模式(懒汉式和饿汉式)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【多线程案例】单例模式(懒汉模式和饿汉模式)

    提起单例模式,就必须介绍设计模式,而设计模式就是在软件设计中,针对特殊问题提出的解决方案。它是多年来针对一些常见的问题的解决方法,具有良好的可复用性、可扩展性和可维护性。 标准的设计模式有23种,单例模式就是最常见的一种,其目的是确认一个类只有一

    2024年02月10日
    浏览(34)
  • 单例模式(饿汉式单例 VS 懒汉式单例)

    所谓的单例模式就是保证某个类在程序中只有一个对象 1.构造方法私有化(保证对象的产生个数)         创建类的对象,要通过构造方法产生对象        构造方法若是public权限,对于类的外部,可以随意创建对象,无法控制对象个数       构造方法私有化,这样类的外

    2024年02月09日
    浏览(31)
  • 设计模式第一课-单例模式(懒汉模式和饿汉模式)

    个人理解:单例模式实际就是通过类加载的方式获取到一个对象,并且保证这个对象在使用中只有一个,不允许再次被创建 1、懒汉模式的基础写法 代码解释: (1)、编写LazySingleton类的时候,需要将成员属性设定为static,这样才会是类属性 (2)、重写构造方法,将其设置

    2024年02月05日
    浏览(29)
  • 【单例模式】饿汉式、懒汉式、静态内部类--简单例子

    单例模式是⼀个单例类在任何情况下都只存在⼀个实例,构造⽅法必须是私有的、由⾃⼰创建⼀个静态变量存储实例,对外提供⼀个静态公有⽅法获取实例。 目录 一、单例模式 饿汉式  静态内部类 懒汉式 反射可以破坏单例 道高一尺魔高一丈 枚举 类⼀加载就创建对象,这

    2024年04月23日
    浏览(36)
  • 24种设计模式之单例模式(饿汉式、懒汉式)

    单例模式( Singleton Pattern )是指确保一个类在任何情况下都绝对只有一个实例,并提供一个全局访问点。单例模式是创建型模式。单例模式在现实生活中应用也非常广泛,例如,总统,班主任等。J2EE标准中的ServletContext 、ServletContextConfig 等、Spring框架应用中的。 特点:构造方

    2024年02月07日
    浏览(35)
  • Java中单例(单态、原子)设计模式(饿汉式/懒汉式)

    先看文章目录,大致了解知识点结构,直接点击文章目录可以跳转到文章指定位置。 设计模式就是设计出来的固定问题的解决方法,描述了在软件设计过程中的一些不断重复发生的问题和解决方案。遇到类似问题的时候可以直接使用现成的模式方案。 ①单例模式中一个类只

    2024年02月04日
    浏览(28)
  • c++单例模式包括懒汉模式和饿汉模式(优劣势分析和改进方法)

    在整个软件的运行过程中,让整个类有且只有一个实例化对象存在于整个进程中。 是最简单的一个设计模式,然后再项目开发中也是使用最广的。 1.节省资源:再整个软件的运行过程中,只有一个实例化对象,不用重新分配新的堆空间。 2.数据的传递:由于单例只会创建一个

    2024年02月21日
    浏览(31)
  • Java单例模式的五种实现方式 懒汉式 饿汉式 双重校验锁 静态变量 静态内部类 枚举实现单例模式等

    Java单例模式是一种设计模式,用于确保一个类只有一个实例,并提供全局访问点以获取该实例。它通常用于需要共享资源或控制某些共享状态的情况下。 懒汉式:在类加载的时候就创建对象,要再调用方法时才创建对象,减少内存开销。 饿汉式:再类加载的时候就实例化对

    2024年04月27日
    浏览(26)
  • 如何理解单例模式----饿汉式?

    目录 1.前言 2.本质 3.代码默写 在面试中,理解和掌握单例模式是非常重要的。本文旨在帮助读者深入理解饿汉式单例模式,并通过简洁明了的解释和示例代码,使读者能够轻松掌握并默写出饿汉式单例模式的代码实现。 饿汉式单例模式是一种单例设计模式的实现方式,它在

    2024年01月18日
    浏览(30)
  • 【Java中23种设计模式-单例模式--饿汉式】

    加油,新时代打工人! 简单粗暴,直接上代码。 23种设计模式定义介绍 Java中23种设计模式-单例模式 Java中23种设计模式-单例模式2–懒汉式线程不安全 Java中23种设计模式-单例模式2–懒汉式2线程安全

    2024年02月22日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包