【发布时间】:2012-03-06 11:07:20
【问题描述】:
一台计算机有 RAM 内存,但它也有更小、更快的 CPU 内存缓存。
Java 内存模型保证在使用volatile 访问变量时刷新 CPU 内存缓存,但由于我们仅在单个线程的单个类中使用该易失性变量,因此不确定 JIT 是否只是优化它离开。
要诊断一个错误(只有在我们调用 Thread.sleep() 的时间足够长时才会出现),我们需要能够做这样的事情(而不是 sleep()):
System.clearCpuCache();
实现这种方法的最简单和最可靠的方法是什么?它应该保证它不会 JIT 优化掉缓存刷新。 我们只能在启用 JIT 的情况下重现我们的错误,因此禁用 JIT 不是一种选择。
【问题讨论】:
-
进入和退出
synchronized块也应该可以工作 -
我从未听说过 JIT 优化了易失性写入。你有任何文件证明它会这样做吗?
-
@Johannes 根本没有证据,只是怀疑:)
-
你说的是一个错误。它的症状是什么?当你只使用一个线程时,遇到 volatile、JIT 和并发问题是很奇怪的。如果可能的话,请发布一个可测试的代码,其中包含产生错误的“睡眠”。你可能看错了方向。
-
赏金评论中的“刷新存储缓冲区”是什么意思?你选择了相关的词吗?请提供详细信息和代码
标签: java concurrency volatile synchronized