美文网首页
java诡异的内存乱序内存可见性

java诡异的内存乱序内存可见性

作者: 每天学点编程 | 来源:发表于2018-02-11 06:56 被阅读15次

请关注我的微信公众号

个人微信公众号

技术交流群 (仅作技术交流):642646237

​请关注我的头条号:

诡异的内存——例子

诡异的内存——例子——竞态条件

根据线程执行的时序,这段代码的输出可能是The meaning of life is XX或者I don't know the answer。

诡异的内存——例子——乱序执行

但是这个例子的运行结果也可能是:
The meaning of life is: 0
answerReadytrueanswer值为0,也就是第6行和第7行颠倒了执行顺序。

诡异的内存——乱序执行

编译器的静态优化可以打乱代码的执行顺序;
JVM的动态优化也会打乱代码的执行顺序;
硬件可以通过乱序执行来优化其性能。

诡异的内存——内存不可见

answerReady有可能不会变成true导致代码无法退出。

诡异的内存——发生乱序和内存不可见的原因

编译器、JVM、硬件都不应插手修改原本的代码逻辑。
但是运行效率提升,尤其是共享内存架构的运行效率提升,都仰仗于此类代码优化。因此无法摆脱此类优化的副作用的影响。

内存可见性

Java内存模型定义了何时一个线程对内存的修改对另一个线程可见。基本原则是,如果读线程和写线程不进行同步,就不能保证可见性。

如何保证内存可见性

  • 通过获取对象的内置锁;
  • 开启一个线程并通过join()检查线程是否已经终止;
  • 使用java.util.concurrent包提供的工具。

采用锁方式保证内存可见性注意事项

两个线程都需要进行同步。只有其中一个线程进行同步是不够的。

相关文章

网友评论

      本文标题:java诡异的内存乱序内存可见性

      本文链接:https://www.haomeiwen.com/subject/peqctftx.html