Java内存模型中提到:当线程退出同步块作为释放关联监视器的一部分时,JMM要求将本地处理器缓存刷新到主内存。同样,作为在进入同步块时获取监视器的一部分,本地缓存无效,以便后续读取将直接进入主内存而不是本地缓存。
那么为什么在该代码中我必须将实例声明为易失性,因为当第二个线程进入同步块时将直接进入主内存?
public final class MySingleton {
private static MySingleton instance = null;
private MySingleton() { }
public static MySingleton getInstance() {
if (instance == null) {
synchronized (MySingleton.class) {
if (instance == null) {
instance = new MySingleton();
}
}
}
return instance;
}
}
我的意思是当另一个线程进入同步块并进行第二次检查时,它应该如上所述从主内存更新。