C#和Java中的易失性有什么区别



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

  • *"从易失性读取或使用 Thread.volatileRead 方法在逻辑上是一个获取围栏"
  • "写入易失性或使用 Thread.volatileWrite 方法在逻辑上是一个释放围栏" *

这些围栏适用于编译器级别和体系结构级别。

当然,VC++的主要区别在于围栏只应用于编译器级别。

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

转换:

栅栏 = 屏障屏障 = 围栏

引用:

Joe Duffy (Windows 上的并发编程)

在Java中,javac编译器对volatile几乎不做任何事情。 它不会对语句重新排序,也几乎不进行优化。

另一方面,JIT 可以进行相当多的优化和重新排序。

volatile的重要特征是;

  • 读/写访问无法优化
  • 易失性写入之前发生的任何写入都必须在写入之前发生。
  • 在易失性读取之后发生的任何读取都必须在读取之后发生。

相关内容

  • 没有找到相关文章

最新更新