下边拿dcl单例模式进行举例说明:
public class Singleton {
private int num=100;
private static Singleton singleton;
private Singleton (){}
public static Singleton getSingleton() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
曾经误以为是jmm的模型中,后续线程T2中工作内存副本中先得到了null(通过了第一次null判断,之后别的线程T1获取锁创建了实例但是未能及时通知T2改变)未被及时通知变化导致的了,所以导致进入在第二次为空判断时还是null,后来知道这么理解是错误的,看下边红字就知道了
补充一些知识:
java内存模型与synchronized关键字
synchronized关键字强制实施一个互斥锁,使得被保护的代码块在同一时间只能有一个线程进入并执行。当然synchronized还有另外一个 方面的作用:在线程进入synchronized块之前,会把工作存内存中的所有内容映射到主内存上,然后把工作内存清空再从主存储器上拷贝最新的值(经测试sleep,wait&#