Java equivalent to Thread.MemoryBarrier

本文关键字:MemoryBarrier Thread to equivalent Java | 更新日期: 2023-09-27 18:20:03

在Java中,我如何显式触发全内存围栏/屏障,等同于的调用

System.Threading.Thread.MemoryBarrier();

在C#中?

我知道,由于Java5对volatile的读取和写入,变量一直导致内存不足,但也许有一种(有效的)方法没有volatile

Java equivalent to Thread.MemoryBarrier

MemoryBarrier()相比,Java的发生在之前,它是一个更锋利的工具,在维护线程安全的同时,为积极的优化留下了更多的余地。

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

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

Java 8,通过JEP 108添加了另一种可能性。访问Java API、fullFence、loadFence和storeFence三个围栏。

没有直接的等价物。使用不稳定的领域或更高层次的东西。