0

在我读过的一些.net文档中,这是编译器处理易失性的方式:

  • *“从 volatile 读取或使用 Thread.VolatileRead 方法在逻辑上是一个获取栅栏”
  • “写入 volatile 或使用 Thread.VolatileWrite 方法在逻辑上是一个释放栅栏” *

这些围栏适用于编译器和架构级别。

当然,VC++ 的主要区别在于栅栏仅适用于编译器级别。

所以我的问题是,Java 中 volatile 的内存重新排序预防语义是什么?

转换:

栅栏 = 屏障 屏障 = 栅栏

参考:

Joe Duffy(Windows 上的并发编程)

4

1 回答 1

1

在 Java 中,javac编译器对 volatile 几乎什么都不做。它不会重新排序语句并且几乎没有优化。

另一方面,JIT 可以做很多优化和重新排序。

的重要特征volatile是;

  • 读/写访问无法优化
  • 在易失性写入之前发生的任何写入都必须在写入之前发生。
  • 在易失性读取之后发生的任何读取都必须在读取之后发生。
于 2014-02-25T22:24:38.070 回答