在一些.net文档中,我读到这是编译器处理易失性的方式:
- *"从易失性读取或使用 Thread.volatileRead 方法在逻辑上是一个获取围栏"
- "写入易失性或使用 Thread.volatileWrite 方法在逻辑上是一个释放围栏" *
这些围栏适用于编译器级别和体系结构级别。
当然,VC++的主要区别在于围栏只应用于编译器级别。
所以我的问题是,Java 中易失性的内存重新排序预防语义是什么?
转换:
栅栏 = 屏障屏障 = 围栏
引用:
Joe Duffy (Windows 上的并发编程)
在Java中,javac
编译器对volatile几乎不做任何事情。 它不会对语句重新排序,也几乎不进行优化。
另一方面,JIT 可以进行相当多的优化和重新排序。
volatile
的重要特征是;
- 读/写访问无法优化 在
- 易失性写入之前发生的任何写入都必须在写入之前发生。
- 在易失性读取之后发生的任何读取都必须在读取之后发生。