首页 > 解决方案 > 为什么不安全的双重检查锁定可以返回空值?

问题描述

有人告诉我不安全的双重检查锁定是不好的,因为它可能在某些竞争条件下返回 null,所以应该避免。

不安全的双重检查锁定习语:

public class UnsafeDCLFactory {
    private Singleton instance;

    public Singleton get() {
        if (instance == null) {  // read 1, check 1
            synchronized (this) {
                if (instance == null) { // read 2, check 2
                    instance = new Singleton();
                }
            }
        }
        return instance; // read 3
    }

    static class Singleton {
        private Date d;
        public Singleton() {
            this.d = new Date();
        }
    }
}

当我们调用 get()方法时,可能会返回 null,尽管这种情况非常罕见。但我只是想知道为什么可以返回 null ?这是否意味着即使'read 1'读取了一个非空值,'read3'仍然可以读取一个空值?

标签: javaconcurrencythread-safety

解决方案


是的,这是可能的(尽管非常非常不可能)。

查看这篇关于 Java 中的安全发布的文章。它还处理双重检查锁定和可能的“空”返回。


推荐阅读