手写DCL双重验证单例模式

r囧r小猫 2022-11-03 04:03 236阅读 0赞

直接上代码

  1. public class Singleton{
  2. private volatile static uniqueInstance;
  3. private Singleton(){ }
  4. public static Singleton getInstance(){
  5. if(uniqueInstance == null){
  6. synchronized (Singleton.class){
  7. if(uniqueInstance == null){
  8. uniqueInstance = new Singleton();
  9. }
  10. }
  11. }
  12. return uniqueInstance;
  13. }
  14. }

单例模式要程序运行期间,有且仅被实例化一次。

第一次判断对象未初始化,进行加锁操作,加锁范围是单例类对象,同一时间只有一个线程可以拿到这个锁资源,保证实例化过程不会并行。

再讲讲为什么要加volatile关键字,对象实例化过程

  • 申请内存空间
  • 根据对象类型初始化
  • 内存地址赋值对象引用

但是JVM执行会有指令重排序,2、3步骤可能乱序执行,单机下不会发生问题,多线程情况,A线程发现未实例化,去申请锁实例化执行到1、3,线程B开始判断,此时uniqueInstance不为空,但是没有初始化,B线程拿到后可能会抛出空指针。

发表评论

表情:
评论列表 (有 0 条评论,236人围观)

还没有评论,来说两句吧...

相关阅读

    相关 模式

    1. 静态内部类实现单例(线程安全、效率高) 一。静态内部类实现:这种方式是 Singleton 类被装载了, instance 不一定被初始化。因为 Singleton

    相关 模式

    经常遇到的一道笔试题,此处自己喜欢编写的饿汉式和静态内部类的方式 不考虑反序列化的问题,不相信会有这么傻逼的要必须要将单例进行反序列化来破坏单例 饿汉式: class S