欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java 单例双检锁

程序员文章站 2022-07-14 09:10:33
...
public class InstanceT {

    // private 保证无法在在类以外被创建
    private InstanceT(){};

    // volatile 保证指令不被排序,防止指令重排序后,多线程情况下拿到半初始化的对象instance。 
    // 使用 synchronized 在 synchronized 作用的区域内相当于是单线程在执行,单线程下的指令重排序是没有问题,但是这个场景不是单线程,所以需要 volatile 来保证有序性,防止cpu为了性能进行指令重排序。
    private static volatile InstanceT instance;

    public static InstanceT getInstance() {
        // 多线程情况下,先判断 instance 是否为 null 后上锁,可以提升性能,反之多个线程都需要 synchronized
        if (instance == null) {
            synchronized (InstanceT.class) {
                // 防止在上锁阶段,对象被别的线程已经创建,需要再次判断 instance 是否为 null
                if (instance == null) {
                    instance = new InstanceT();
                }
            }
        }
        return instance;
    }

}

相关标签: java基础 java