请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

双重检查模式的问题

老师,我之前在看有关单例模式的讲解时,资料上说由于jmm的原因使用双重检查可能会导致错误,是这样吗

正在回答 回答被采纳积分+3

1回答

悟空 2019-09-28 19:14:39

如果不加volatile确实有可能导致错误,如果你用课程里13-11的写法就没问题。

0 回复 有任何疑惑可以回复我~
  • 结合老师讲的,也查了资料,都说对象实例化不是原子性操作,不加 volatile 会导致赋值引用和对象初始化被重排序,但没法像其他线程问题复现啊,请问,老师复现过不加 volatile 关键字会导致异常的这种场景吗
    回复 有任何疑惑可以回复我~ 2020-06-02 00:33:05
  • 现在的JVM对此问题基本都有了特殊处理,已经不容易复现了,只有特定的非主流虚拟机才可能复现。你看下这个资料:http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html
    回复 有任何疑惑可以回复我~ 2020-06-02 01:15:41
  • 意思是现在接触到的主流 jvm 基本不用加 volatile 但为了保险还是加上:) 老师给的链接文章里好像没有聊到 jvm 对对象实例化做了哪些“特殊处理”导致对象实例化这个过程被重排序的问题很难复现。但是聊到另一个有意思的问题:不可变对象的引用赋值是原子性的。意思是 final 可以代替 volatile 吗(他这里的赋值引用是原子性的是包括对象实例化的整个过程是原子性吗,如果是,那对象实例化是否被重排序岂不是都不影响 :)(希望我没跑偏,感谢老师回复
    回复 有任何疑惑可以回复我~ 2020-06-03 02:24:43
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信