hzlhshzbg 2010-12-30 11:39
浏览 175
已采纳

關于多線程中雙檢查鎖(DCL)初始化發布安全性問題疑惑?

最近在看,有提到雙檢查鎖發布對象的功能.
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]

針對引種方式正確的解釋應該為何?

  • 写回答

4条回答 默认 最新

  • beneo 2010-12-30 13:00
    关注

    对了,同步不是解决指令重排的,而是volatile关键字

    [quote]
    Some languages and compilers may provide sufficient facilities to implement functions which address both the compiler reordering and machine reordering issues. In Java version 1.5 (also known as version 5), the volatile keyword is now guaranteed to prevent certain hardware and compiler re-orderings, as part of the new Java Memory Model.
    [/quote]

    synchronized只能保证java内存模型原子与可见性

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!