1

私の知る限り、同期内で行われた変更が同じロックで同期している次のスレッドに表示される「前に起こる」状態。

private final Object closeLock = new Object();
private volatile boolean closed = false;

public void close() throws IOException {
    synchronized (closeLock) {
        if (closed) {
            return;
        }
        closed = true;
    }
    if (channel != null) {
       channel.close();
    }

    fd.closeAll(new Closeable() {
        public void close() throws IOException {
           close0();
       }
    });
}

冗長ではありませんか?

4

3 に答える 3

2

Java では同期によって、可視性と原子性という 2 つの異なる保証が行われます。変数を作成volatileすると、JVM が書き込みの可視性が「事前発生」に適切に追従することが保証されますが、同期ブロック内のチェック後動作がアトミックであることは保証されません。

原子性が保証されていない場合、そのシーケンスでのスレッド インターリーブif (closed) return; closed = true;により、同期の問題が発生する可能性があります。

変数が常に同じモニターの同期ブロック内からアクセスされる場合、これvolatileは必要ありませんが、その他の小さなパフォーマンスへの影響がある可能性があります。

于 2015-08-05T13:57:40.377 に答える
1

変数は、ネイティブ メソッドによってアクセスされる可能性があります。JDK のネイティブ ソース コードを確認する必要があります。

于 2015-08-05T14:21:43.900 に答える