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
。
与MemoryBarrier()
相比,Java的发生在之前,它是一个更锋利的工具,在维护线程安全的同时,为积极的优化留下了更多的余地。
正如您所期望的,一个更清晰的工具也需要更加小心地正确使用,这就是volatile
变量访问的语义可以描述的方式。您必须在写入站点上写入volatile
变量,并在每个读取站点上从同一个volatile读取。言下之意,您可以有任意数量的独立的、本地化的"内存屏障",每个volatile
变量一个,并且每个只保护从该变量可到达的状态。
完整的习惯用法通常被称为"安全发布"(尽管这是一个更通用的术语),意味着填充一个将在线程之间共享的不可变对象图,然后将其引用到volatile
变量。
Java 8,通过JEP 108添加了另一种可能性。访问Java API、fullFence、loadFence和storeFence三个围栏。
没有直接的等价物。使用不稳定的领域或更高层次的东西。