最近在看,有提到雙檢查鎖發布對象的功能.
public MyObject{
private static MyObect obj;
public static MyObect getInstance(){
if(obj == null){
synchronized(MyObect .class){
if(obj == null)
obj = new MyObject();//这里
}
}
return obj;
}
}
有介紹此種方式可能會看看過期值﹐或無效狀態值。
大百度上搜索到以下兩種答案:
第一種﹕
在[url]http://dev.csdn.net/author/axman/4c46d233b388419e9d8b025a3c507b17.html[/url]中提到此種主式(在jdk1.2以上)并不會造成上述異常。
第二種﹕
在[url]http://www.verybc.com/a/hulianwang/2009/1124/8780.html[/url]中提到上種方式會造成上述情況﹐但在解釋時提到[color=red]按照顺序的话,接下来应该运行的步骤是 1) 分配新的Singleton对象的内存 2) 调用Singleton的构造器,初始化成员字段 3) instance被赋为指向新的对象的引用。
前面说过,编译器或处理器都为了升高性能都有估计停止指令的乱序运行,线程一的真正运行步骤估计是1) 分配内存 2) instance指向新对象 3) 初始化新举例。假如线程二在2完成后3运行前被唤醒,它看到了一个的不为null的instance,跳出窍门体走了,带着一个的还没初始化的Singleton对象。[/color]。此段解釋與書中(339頁)提到[color=red]同步仰制了編譯器﹐運行時和硬件對存儲操作的各種方式的重排序(因為obj = new MyObject()是在同步塊中)[/color]
針對引種方式正確的解釋應該為何?