3

在Java中,我怎样才能显式触发一个完整的内存围栏/屏障,等于调用

System.Threading.Thread.MemoryBarrier();

在 C# 中?

我知道,由于 Java 5 对volatile变量的读取和写入导致了完整的内存围栏,但也许有一种(有效的)方法没有volatile.

4

3 回答 3

3

与 相比MemoryBarrier(),Java 的happens-before是一个更加清晰的工具,在保持线程安全的同时为积极优化留下了更多的余地。

如您所料,更清晰的工具也需要更加小心才能正确使用,这就是volatile可以描述变量访问的语义的方式。您必须写入volatile写入站点上的变量并从每个读取站点上的相同 volatile读取。暗示您可以拥有任意数量的独立的、本地化的“内存屏障”,每个volatile变量一个,并且每个仅保护从该变量可到达的状态。

完整的习惯用法通常被称为“安全发布”(尽管这是一个更通用的术语),并且意味着填充将在线程之间共享的不可变对象图,然后将其引用写入volatile变量。

于 2014-08-28T16:17:50.427 回答
2

Java 8 通过JEP 108增加了另一种可能性。对三个栅栏的访问是对 Java API、fullFence、loadFence 和 storeFence。

于 2015-03-27T10:18:10.457 回答
0

没有直接的等价物。使用 volatile 字段或更高级的东西。

于 2014-08-28T16:09:51.673 回答