Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#和java中的volatile有什么区别?_C#_Java_Multithreading_Memory Optimization - Fatal编程技术网

c#和java中的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上的并

在一些.net文档中,我读到编译器是如何处理volatile的:

  • *“从volatile或使用Thread.volatireRead方法读取数据在逻辑上是一个获取围栏”
  • “写入volatile或使用Thread.VolatileWrite方法在逻辑上是一个释放围栏”*
这些围栏适用于编译器和架构级别

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

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

转换:

栅栏 栅栏

参考资料:


Joe Duffy(Windows上的并发编程)

在Java中,
javac
编译器几乎不使用volatile。它不会对语句进行重新排序,也几乎不会进行优化

另一方面,JIT可以进行相当多的优化和重新订购

volatile
的重要特征是:

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

你应该在JLS()中找到答案,当然,我所知道的词汇会有所不同;Java中的volatile read相当于一个acquire,一个对发布的写入-与CLR相同。