对此我感到困惑,仔细检查锁定需要易变。
public class someClass {
public volatile static uniqueInstance = null;
public static someClass getInstance() {
if(uniqueInstance == null) {
synchronized(someClass.class) {
if(uniqueInstance == null) {
uniqueInstance = new someClass();
}
}
}
return uniqueInstance;
}
原因是Why is volatile used in this example of double checked locking。 据此解释,原因是被部分构造的对象“初始化”。
真正的问题是线程A可能会为 实例完成构造之前。线程B将 查看该作业并尝试使用它。这导致线程B 失败,因为它使用的是部分构造的版本 实例。
但是为什么线程B会看到最新值,线程B会在同步块完成之前读取旧值。
每个线程可能会看到不同的快照,因此一个线程在同步块内读取变量的事实并不意味着另一个线程在不同步的情况下读取变量将看到相同的状态 提前致谢。
预先感谢