使用Java指令重新排序时,JVM会在编译时或运行时更改代码的执行顺序,这可能会导致不相关的语句被乱序执行。
编辑:指令重新排序可能会产生与直觉相反的结果。许多CPU架构可以重新排序机器指令的内存交互,即使编译器没有改变指令顺序,也会导致类似的意外结果。因此,术语存储器重新排序可能比指令重新排序更合适。
所以我的问题是:
有没有人可以提供一个示例Java程序/片段,它可靠地显示了指令重新排序问题,该问题也不是由其他同步问题引起的(例如缓存/可见性或非原子读/写,就像我在my previous question中尝试这样的演示失败一样)
需要强调的是,我并不是在寻找理论上的重新排序问题的例子。我正在寻找的是一种通过查看运行程序的不正确或意想不到的结果来实际演示它们的方法。
除了一个错误的行为示例之外,仅仅展示在一个简单程序的汇编中发生的实际重新排序也是很好的。
发布于 2018-10-13 23:23:28
对于单线程执行,重新排序根本不是问题,因为Java内存模型(Java Memory Model,JMM)(保证与写入相关的任何读取操作都是完全有序的),并且不会导致意外的结果。
对于并发执行,规则是完全不同的,并且事情变得更加复杂(即使提供了简单的示例,这会引发更多的问题)。但是即使这样,JMM也完全用所有的角例来描述,所以,意外的结果也禁止了。通常,如果所有障碍物都放置正确,则禁止。
为了更好地理解重新排序,我强烈推荐this主题,里面有很多示例。
https://stackoverflow.com/questions/52648800
复制相似问题