最近我参加了一些关于一些设计模式的讲座:
public static Singleton getInstance() { if (instance == null) { synchronized(Singleton.class) { //1 Singleton inst = instance; //2 if (inst == null) { synchronized(Singleton.class) { //3 inst = new Singleton(); //4 } instance = inst; //5 } } } return instance; }
取自:Double-checked locking: Take two
我的问题与上面提到的模式无关,但是与synchronized块有关:
在第1行和第1行中完成的双重同步是否有任何好处? 3关于同步操作是否在同一个对象上完成的事实?
解决方法
在旧的Java内存模型(JMM)中,退出同步块据称将本地数据刷新到主内存.输入用于重新读取缓存数据的同步块. (此处,缓存包含具有相关编译器优化的寄存器.)旧JMM已损坏且未正确实现.
在新的JMM中它没有做任何事情.新JMM指定为1.5,并针对“Sun”1.4 JRE实现. 1.5前一段时间完成了它的服务终止期限,所以你不必担心旧的JMM(好吧,也许Java ME会做一些不可预测的事情).