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

何を達成しようとしていますか。「前」操作と「後」操作の並べ替えを防止しようとしているだけですか? 操作をアトミックにする必要がありますか?

質問に答えるには、「はい、ロックするとフル メモリ フェンスと同じ効果が得られます」などがあります。これにより、Before 操作と After 操作の順序が変更されないことが保証されます。また、同期ブロック内のすべての書き込みが他のスレッドから見えるようになります。さらに、ロックを保持している間に行われたすべての操作は、アトミックに行われます。完全なフェンスを追加するだけでは達成できない何か。

Java で完全なフェンスをトリガーする他の方法は、揮発性変数に書き込むことです。

于 2016-06-11T01:44:35.407 に答える