c#和java中的volatile之间有什么区别?

时间:2014-02-25 22:19:57

标签: c# java multithreading memory-optimization

在一些.net文档中,我已经读过这是编译器处理volatile的方法:

  • *“从volatile中读取或使用Thread.VolatileRead方法在逻辑上是一个获取围栏”
  • “写入易失性或使用Thread.VolatileWrite方法在逻辑上是一个发布栏”*

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

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

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

转换:

围栏=障碍 障碍=围栏

参考文献:

Joe Duffy(Windows上的并发编程)

1 个答案:

答案 0 :(得分:1)

在Java中,javac编译器与volatile几乎没有任何关系。它没有重新排序语句,几乎没有优化。

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

volatile的重要功能是;

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