如何在不使用sun.misc.Unsafe的情况下触发完整的内存栅栏?

时间:2015-12-31 07:08:41

标签: java multithreading memory-fences

我有兴趣在不使用sun.misc.Unsafe的情况下触发完整的记忆围栏。

以下Java代码是否会触发完整的内存栅栏?

public final class Foo {
    public void bar() {
        // Before memory fence?
        synchronized(this) {
            // After memory fence?
        }
    }
}

以下Java代码是否是否会触发完整的内存栅栏?

public final class Foo {
    private final Object monitor = new Object();
    public void bar() {
        // Before memory fence?
        synchronized(monitor) {
            // After memory fence?
        }
    }
}

1 个答案:

答案 0 :(得分:1)

你想要实现什么?您是否只是想阻止对“之前”和“之后”操作进行重新排序?你需要你的操作是原子的吗?

要回答这个问题,是的,锁定将与完整内存栏和更多具有相同的效果。它将确保您的Before和After操作不会重新订购。它还将确保同步块中的所有写入对其他线程可见。此外,在保持锁定的同时完成的所有操作都将以原子方式进行。只添加完整围栏的东西就不会完成。

在java中触发完整围栏的其他方法是写入volatile变量。