3

我有兴趣在不使用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?
        }
    }
}
4

1 回答 1

1

你想达到什么目的。您是否只是想防止重新排序“之前”和“之后”操作?你需要你的操作是原子的吗?

要回答这个问题,是的,锁定将具有与完整内存围栏相同的效果等等。它将确保您的之前和之后的操作不会重新排序。它还将确保您在同步块中的所有写入对其他线程都是可见的。此外,您在持有锁时完成的所有操作都将自动发生。仅仅添加一个完整的围栏是无法完成的。

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

于 2016-06-11T01:44:35.407 回答