双重校验锁单例模式,volatile修饰

双重校验锁单例模式

  • 使用volatile作用
    1.保持可见性
    2.防止指令重排

下面代码
upSingleton = new Singleton(),其实会分为三步执行

  1. 为 uniqueInstance 分配内存空间
  2. 初始化 uniqueInstance
  3. 将 uniqueInstance 指向分配的内存地址

但jvm指令重排可能会导致执行顺序为1->3->2,如果在多线程的情况下,会返回没有实例化的upSingleton对象,比如线程一执行了1和3,但线程二进来时判断发现upSingleton不为空,所以就直接返回但upSingleton此时还没有初始化

    public Singleton() {
        System.out.println(Thread.currentThread().getName()+":只能执行一次");
    }

    private static volatile Singleton upSingleton;

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

你可能感兴趣的:(双重校验锁单例模式,volatile修饰)