在Java中,我如何显式触发完整的内存栅栏/屏障,等同于
的调用System.Threading.Thread.MemoryBarrier();
在C#中?
我知道,因为Java 5对volatile
变量的读写操作已经导致了完整的内存限制,但是可能存在一种没有volatile
的(有效)方式。
答案 0 :(得分:3)
与MemoryBarrier()
相比,Java的发生之前是一个更加敏锐的工具,为保持线程安全而在积极优化方面留下更多余地。
如您所料,更清晰的工具也需要更加谨慎地使用,这就是如何描述volatile
变量访问的语义。您必须在写入站点上写入volatile
变量,并在每个阅读站点上从读取相同的易失性。通过暗示,您可以拥有任意数量的独立,本地化和内存障碍,每个volatile
变量一个,并且每个都只保护从该变量可以到达的状态。
完整的成语通常被称为"安全出版物" (虽然这是一个更通用的术语)并且意味着填充将在线程之间共享的不可变对象图,然后将对它的引用写入volatile
变量。
答案 1 :(得分:2)
Java 8,通过JEP 108增加了另一种可能性。可以访问Java API,fullFence,loadFence和storeFence。
答案 2 :(得分:0)
没有直接的等价物。使用volatile字段或更高级别的东西。