开发者社区> 问答> 正文

关于volatile

对于图中这段代码的 volatile 域,如果我注释掉L6,L9的代码,那么指令重排还有意义吗?当然 可见性在后面的if判断中还是可用的,博客一直强调 volatile 这个单例的指令重排,可是我完全感觉不到这个指令重排的用途,而且多数单例也不可能存在 L6 和 L9 的那种操作吧

图片.png

展开
收起
景凌凯 2020-04-24 16:45:53 1027 0
1 条回答
写回答
取消 提交回答
  • 有点尴尬唉 你要寻找的东西已经被吃掉啦!
    • olatile 除了指令重排,还有一个可见性。volatile 的禁止指令重排序优化和可见性,是它的两种特性,volatile 的禁止指令重排序优化 。这个本来是在多线程情况下,CPU的执行指令优化。你把他放在单线程和单CPU环境讨论,意义本来就不大。
    • instance = new Singleton() 这一行其实有三步 1.instance内存分配 2.构造函数初始化对象 3.将instance指向分配的内存空间。jvm的指令重排序可能会导致2 3的顺序不能保证 若3在2之前 即3执行完了2还没执行 被另一个线程抢去 这时线程2认为instance已经是非null,并使用 则会报错
    2020-04-24 16:46:11
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
原子变量与内存模型 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载