java - 为什么在双重检查锁定中使用了volatile

标签 java design-patterns locking singleton double-checked-locking

从Head First设计模式手册中,具有双重检查锁定的单例模式已实现如下:

public class Singleton {
    private volatile static Singleton instance;
    private Singleton() {}
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}


我不明白为什么要使用volatilevolatile用法是否会违反使用双重检查锁定(即性能)的目的?

最佳答案

理解为什么需要volatile的一个很好的资源来自JCIP书。维基百科也有该材料的decent explanation

真正的问题是Thread A可能在完成构造instance之前为instance分配了一个内存空间。 Thread B将看到该分配并尝试使用它。这导致Thread B失败,因为它使用的是instance的部分构造版本。

关于java - 为什么在双重检查锁定中使用了volatile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56647905/

相关文章:

java - 使用长时间运行任务的结果重复更新 JLabel

java - 使用带有数组的compareTo方法按姓名和考试成绩对学生进行排序

java - AS/400 创建日记帐 JT400 (Java)

Java 将字符串转换为日期

c# - 长时间运行的有状态 'services' 适合 DDD 的什么地方?

java - 'fair' 和 'unfair' 锁的内部存储差异

java - 同步(this)和观察者通知

java - 我们应该在观察者模式中使用 Wea​​kReference 吗?

java - 适配器和装饰器的区别

oracle - 通过SAS将新表写入Oracle数据库,写入时锁定表