2

クラスReentrantReadWriteLockには、次の興味深いコメントがあります。

transient ThreadLocalHoldCounter readHolds;

Sync() {
    readHolds = new ThreadLocalHoldCounter();
    setState(getState()); // ensures visibility of readHolds
}

「可視性を確保する」とはどういう意味ですか? 私が尋ねる理由は、スレッド ローカルの readHolds がリセットされているように見える状況があるためです (スレッド ローカルは WeakReferences として実装されているため、含まれている Sync オブジェクトがまだ生きている限り、それは発生しないはずです)。setState/getState は単に別のインスタンス変数を変更し、readHolds には触れないでください。

4

1 に答える 1

3

このsetState(int)メソッドは、volatile 変数への代入を実行します。これにより、現在のスレッドによって実行されたすべての割り当て (readHolds を含む) が「メイン メモリ」にフラッシュされます。

呼び出している他のスレッドはgetState()、この同じ揮発性変数を読み取ります。変数は揮発性であるため、最初にスレッドのキャッシュがクリアされ、後続の読み取り操作がメイン メモリに強制的に送信され、そこで の最新の値が検出されますreadHolds

于 2009-11-04T17:21:57.480 に答える