在Java中,我怎样才能显式触发一个完整的内存围栏/屏障,等于调用
System.Threading.Thread.MemoryBarrier();
在 C# 中?
我知道,由于 Java 5 对volatile
变量的读取和写入导致了完整的内存围栏,但也许有一种(有效的)方法没有volatile
.
在Java中,我怎样才能显式触发一个完整的内存围栏/屏障,等于调用
System.Threading.Thread.MemoryBarrier();
在 C# 中?
我知道,由于 Java 5 对volatile
变量的读取和写入导致了完整的内存围栏,但也许有一种(有效的)方法没有volatile
.
与 相比MemoryBarrier()
,Java 的happens-before是一个更加清晰的工具,在保持线程安全的同时为积极优化留下了更多的余地。
如您所料,更清晰的工具也需要更加小心才能正确使用,这就是volatile
可以描述变量访问的语义的方式。您必须写入volatile
写入站点上的变量并从每个读取站点上的相同 volatile读取。暗示您可以拥有任意数量的独立的、本地化的“内存屏障”,每个volatile
变量一个,并且每个仅保护从该变量可到达的状态。
完整的习惯用法通常被称为“安全发布”(尽管这是一个更通用的术语),并且意味着填充将在线程之间共享的不可变对象图,然后将其引用写入volatile
变量。
Java 8 通过JEP 108增加了另一种可能性。对三个栅栏的访问是对 Java API、fullFence、loadFence 和 storeFence。
没有直接的等价物。使用 volatile 字段或更高级的东西。