小编Wol*_*yaa的帖子

在Java中使用基于Double Check Locking的Singleton是否安全?

维基百科上列出了Java中的Singleton实现之一:

public class SingletonDemo {
    private static volatile SingletonDemo instance = null;

    private SingletonDemo() {
    }

    public static SingletonDemo getInstance() {
        if (instance == null) {
            synchronized (SingletonDemo.class) {
                if (instance == null) {
                    instance = new SingletonDemo();
                }
            }
        }
        return instance;
    }
}
Run Code Online (Sandbox Code Playgroud)

Java语言规范17条第5款指出,

当构造函数完成时,对象被认为是完全初始化的.在该对象完全初始化之后只能看到对象引用的线程可以保证看到该对象的最终字段的正确初始化值.

好吧,想象一下我们的SingletonDemo类有非final字段.那么,并发线程将能够读取默认值而不是构造函数中指定的正确值吗?

java multithreading final thread-safety java-memory-model

2
推荐指数
1
解决办法
526
查看次数