搜索
当前位置: 6335刘伯温开奖 > 点可见性 >

Java 关键字 Volatile 的一点小问题(已解决)

gecimao 发表于 2019-07-25 20:21 | 查看: | 回复:

  在单核环境下虽然不加 volatile 关键字无法保证在值修改后立刻回写到主存, 但是由于是单核的, 就算切换了另一个线程抢到了执行权但是实际上还是这一个cpu 在工作, 它在干活前必须先把新的值存回主存. 所以新的值只是在旧线程失去执行权时被写回主存(此时 cpu 的总线嗅探机制形同虚设, 因为除了它自己之外根本就没有其他的 cpu, 所以也就不存在缓存失效的问题), 然后在新的线程获得执行权时原封不动的从主存中再取回来. 这时有没有 volatile 关键字对可见性没有任何影响(即永远都是可见的).

  其实这个问题和 mc 关系不大(也有关系...毕竟写个插件mod也得用多线程嘛), 但是在别的论坛问又没人理我, 所以发到 mcbbs 这种 dalao 云集的地方试试...= =

  volatile 的实现是用缓存一致性协议(MESI)来做的(增加汇编指令 lock 来立即更新主存中的值). 根据其特性, MESI 是在至少有两个 cpu 核心的电脑上才有意义, 但是即使电脑只有一个核心, 在 java 编程中依然可以使用多线程技术(看上去像并行的串行), 那在这种情况下 volatile 是不是就失去了其对 可见性 的意义, 只剩下禁止指令重排的功能了?

  被水贴水的不敢发锭了, 没法验证的原因主要是找不到只有一个核心的电脑...

  刚才仔细思考了一下, 核心让多个线程交替执行, 上面那个问题其实可以转化为另一个问题:核心在进行线程交替的时候是否会将寄存器中的值保存回主存? 如果会的话那 volatile 就失去了对可见性的意义. 因为线程切换时会回写到主存, 其他线程看到的永远都是最新的. 相反若直接丢弃寄存器中的数据, 那其他线程看到的还是旧的值. 不加 volatile 让它立即保存就会出现线程安全问题. 在进程切换的时候确实会保存 cpu 现场, 但是线程切换会不会保存寄存器...有木有 dalao 解答一下...

  我猜应该是会保存的, 不保存那线程运行的结果都没了那不是白运行了么...但是又不太敢说这么重要一个关键字在单核环境中就没蛋用.

本文链接:http://valerietracy.net/diankejianxing/943.html
随机为您推荐歌词

联系我们 | 关于我们 | 网友投稿 | 版权声明 | 广告服务 | 站点统计 | 网站地图

版权声明:本站资源均来自互联网,如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

Copyright @ 2012-2013 织梦猫 版权所有  Powered by Dedecms 5.7
渝ICP备10013703号  

回顶部