c#和java中的volatile有什么区别?
在一些.net文档中,我读到编译器是如何处理volatile的:c#和java中的volatile有什么区别?,c#,java,multithreading,memory-optimization,C#,Java,Multithreading,Memory Optimization,在一些.net文档中,我读到编译器是如何处理volatile的: *“从volatile或使用Thread.volatireRead方法读取数据在逻辑上是一个获取围栏” “写入volatile或使用Thread.VolatileWrite方法在逻辑上是一个释放围栏”* 这些围栏适用于编译器和架构级别 当然,VC++的主要区别在于围栏只应用于编译器级别 所以我的问题是,Java中volatile的内存重排序预防语义是什么 转换: 栅栏 栅栏 参考资料: Joe Duffy(Windows上的并
- *“从volatile或使用Thread.volatireRead方法读取数据在逻辑上是一个获取围栏”
- “写入volatile或使用Thread.VolatileWrite方法在逻辑上是一个释放围栏”*
Joe Duffy(Windows上的并发编程)在Java中,
javac
编译器几乎不使用volatile。它不会对语句进行重新排序,也几乎不会进行优化
另一方面,JIT可以进行相当多的优化和重新订购
volatile
的重要特征是:
- 无法优化读/写访问
- 在易失性写入之前发生的任何写入都必须在写入之前发生
- 在易失性读取之后发生的任何读取都必须在读取之后发生