单例设计模式双重检查的作用

先看双重校验锁的写法

public class Singleton {

    /*
        volatile 修饰,
        singleton = new Singleton() 可以拆解为3步:
        1、分配对象内存(给singleton分配内存)
        2、调用构造器方法,执行初始化(调用 Singleton 的构造函数来初始化成员变量)。
        3、将对象引用赋值给变量(执行完这步 singleton 就为非 null 了)。
        若发生重排序,假设 A 线程执行了 1 和 3 ,还没有执行 2,B 线程来到判断 NULL,B 线程就会直接返回还没初始化的 instance 了。

        volatile 可以避免重排序。
     */
    private volatile static Singleton singleton;

    private Singleton() {
    }

    public static Singleton getSingleton() {
        if (singleton == null) {
            synchronized (Singleton.class) {
                if (singleton == null) {
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }

}

为什么要进行两次非空校验?

第一个 if 判断是为了减少性能开销,不用走 synchronized 代码,避免多余的加锁操作,以及锁的等待和竞争

第二个 if 判断是为了避免生成多个对象实例。比如在未创建实例的情况下,A线程和B线程都通过了第一次校验,这时如果通过竞争B线程拿到了锁就会执行一次 new 操作,生成一个实例,然后 B 执行完了 A 就会拿到资源的锁,如果没有第二次判断的话,这时A线程也会执行一次 new 操作,这里就出现了第二个类实例,违背了单例原则。

相关推荐

  1. 设计模式双重检查作用

    2024-06-18 22:42:05       26 阅读
  2. 设计模式-模式双重检查

    2024-06-18 22:42:05       39 阅读
  3. 模式双重检查

    2024-06-18 22:42:05       45 阅读
  4. 模式双重检查锁定是什么?

    2024-06-18 22:42:05       52 阅读
  5. 模式——懒汉模式双重检测锁问题

    2024-06-18 22:42:05       55 阅读
  6. 模式双重效验锁懒汉实现方式

    2024-06-18 22:42:05       40 阅读
  7. 设计模式

    2024-06-18 22:42:05       63 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-18 22:42:05       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-18 22:42:05       106 阅读
  3. 在Django里面运行非项目文件

    2024-06-18 22:42:05       87 阅读
  4. Python语言-面向对象

    2024-06-18 22:42:05       96 阅读

热门阅读

  1. MyBatis 自定义映射 ResultMap:一对多映射关系处理

    2024-06-18 22:42:05       31 阅读
  2. 删除名为 `XXXX` 的 conda 环境的命令

    2024-06-18 22:42:05       29 阅读
  3. LVGL:

    LVGL:

    2024-06-18 22:42:05      28 阅读
  4. NLP - word2vec详解

    2024-06-18 22:42:05       26 阅读
  5. 自动抓取服务器功耗

    2024-06-18 22:42:05       24 阅读
  6. MySQL触发器基本结构

    2024-06-18 22:42:05       32 阅读
  7. 通过摄像头检测步频

    2024-06-18 22:42:05       29 阅读
  8. 通用与垂直,难以预测的胜负之争。

    2024-06-18 22:42:05       31 阅读