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

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

所谓的单例模式就是保证某个类在程序中只有一个对象

一、如何控制只产生一个对象?

1.构造方法私有化(保证对象的产生个数)

        创建类的对象,要通过构造方法产生对象

       构造方法若是public权限,对于类的外部,可以随意创建对象,无法控制对象个数

      构造方法私有化,这样类的外部就彻底无法产生对象,一个对象都没有。

2.单例类的内部提供这个唯一的对象(static)

        构造方法私有化后,对于类的外部而言就一个对象都没有了。因此要在这个类的内部构造出这个唯一的对象,只调用一次构造方法即可(这个单例对象不能是类的成员属性,因为成员变量必须通过对象来访问,但是类的外部根本无法产生对象,(矛盾),因此这个对象必须使用static关键字修饰,静态变量,不依赖类的对象

3.单例类提供返回这个唯一对象的静态方法供外部使用

二、饿汉式单例

饿汉式单例模式是天然的线程安全的。类加载时就创建了这个唯一的对象!!!

/**
 * 饿汉式单例(类加载就产生这个唯一的对象,也不管外部是否调用该对象)。饥不择食,这个类一加载就把惟一的这个对象产生了,
 * 我也不管外部到底用不用这个对象,只要这个类加载到JVM,唯一对象就会产生
 **/
public class SingleTon {
    // 惟一的这一个对象
    private static SingleTon singleTon = new SingleTon();
    private SingleTon() {}
    // 调用此方法时,singleTon对象已经产生过了,多线程场景下取回的是同一个单例对象
    public static SingleTon getSingleton() {
        return singleTon;
    }
}

三、懒汉式单例

懒汉式单例:只有第一次调用getSingleTon(),表示外部需要获取这个单例对象时才产生对象

public class LazySingleTon {
    private static LazySingleTon singleTon ;
    private LazySingleTon(){}
    
    public LazySingleTon getSingleTon(){
        if (singleTon == null){
            singleTon = new LazySingleTon();
        }
        return singleTon;
    }
}

多线程场景下会产生线程安全问题(不能确保只有一个对象产生) 

单例模式(饿汉式单例 VS 懒汉式单例),单例模式,java,开发语言

在这个场景下,三个线程并发调用get方法,此时三个 线程看到的singleTon 都为null,因此,每个线程都创建了一个对象!!

四、解决懒汉式单例的线程安全问题

1.静态方法上加锁

    public synchronized static LazySingleTon getSingleTon(){
        if (singleTon == null){
            singleTon = new LazySingleTon();
        }
        return singleTon;
    }

在方法上上锁,表示同一时间只有一个线程能进入此方法(其他线程想要进入此方法都等待获取锁成功的线程释放锁)。此时,getSingleTon()的内部都是单线程操作(锁的粒度太粗)。

2.double-check(双重加锁)

    private volatile static LazySingleTon singleTon ;
    private LazySingleTon(){}

    public  static LazySingleTon getSingleTon(){
        if (singleTon == null){
            synchronized (LazySingleTon.class){
                if (singleTon == null){
                    singleTon = new LazySingleTon();
                }
            }
        }
        return singleTon;
    }

volatile的作用:内存屏障,可见性

此时有t1,t2,t3三个线程,t1首先获取到了锁,开始执行new操作,虽然还没完全结束,但此时的singleTon != null,对于刚开始执行代码的t2,t3来说,它们看到singleTon != null 直接返回了,但是返回后的单例对象是一个尚未完全初始化的对象

此时采用volatile关键字修饰单例对象,new操作有着一堵墙,其它线程要能执行到return语句,JVM一定保证了new操作完全结束了,之后才会执行return语句

单例模式(饿汉式单例 VS 懒汉式单例),单例模式,java,开发语言

 double-check:防止其他线程恢复执行后多次创建单例对象

当t1先进入同步代码块后,t2,t3卡在获取所得位置,

t1产生对象后释放锁,

t2,t3还是从获取锁的位置继续执行,在他们的工作内存中,singleTon == null 

t2,t3就会再次new对象。文章来源地址https://www.toymoban.com/news/detail-704533.html

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

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

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

相关文章

  • 【Java|多线程与高并发】设计模式-单例模式(饿汉式,懒汉式和静态内部类)

    设计模式是一种在软件开发中常用的解决复杂问题的方法论。它提供了一套经过验证的解决方案,用于解决特定类型问题的设计和实现。设计模式可以帮助开发人员提高代码的可重用性、可维护性和可扩展性。 设计模式有很多,本文主要介绍单例模式. 单例模式是一种创建型设

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

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

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

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

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

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

    2024年02月07日
    浏览(35)
  • 单例设计模式精讲(饿汉式和懒汉式实现的重要方法)

    目录 什么叫做单例模式? 饿汉式和懒汉式的区别? 饿汉式-方式1(静态变量方式) 饿汉式-方式2(静态代码块方式) 懒汉式-方式1(线程不安全) 懒汉式-方式2(线程安全) 懒汉式-方式3(双重检查锁) 懒汉式-方式4(静态内部类方式) 什么叫做单例模式?         涉

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

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

    2024年02月22日
    浏览(40)
  • 关于Java中单例模式(饿汉模式和懒汉模式)的简析

    目录 一.什么是单例模式 二.饿汉模式和懒汉模式 饿汉模式 代码 懒汉模式 代码 关于多线程安全的问题 如何解决懒汉模式多线程安全问题 双if判断 简单来说,就是我们在程序中通过代码进行限制,在该程序中 只能创建一个对象 因为只能创建一个对象,所以对于我们而言就有两种

    2024年02月10日
    浏览(66)
  • 如何理解单例模式----饿汉式?

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

    2024年01月18日
    浏览(30)
  • 【Java多线程】关于多线程的一些案例 —— 单例模式中的饿汉模式和懒汉模式以及阻塞队列

    目录 1、单例模式 1.1、饿汉模式 2.1、懒汉模式  2、阻塞队列 2.1、BlockingQueue 阻塞队列数据结构 对框架和设计模式的简单理解就是,这两者都是“大佬”设计出来的,让即使是一个代码写的不太好的“菜鸡程序员”也能写出还可以的代码。 设计模式也可以认为是对编程语言语

    2024年03月23日
    浏览(82)
  • 【单例模式】饿汉模式和懒汉模式的单例模式

    设计模式是一种 在软件设计中经过验证的解决问题的方案或者模版 。它们是从实践中总结出来的,可以帮助解决常见的设计问题,提高代码的重用性、维护性和扩展性。 设计模式可以分为三大类: 创建型模式(Creational Patterns) :创建型模式关注对象的实例化过程,包括如

    2024年02月16日
    浏览(54)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包