変数が volatile として宣言されている場合、読み取りアクセスごとにローカル キャッシュがメイン メモリから更新され、書き込みアクセスごとにローカル キャッシュがメイン メモリにフラッシュされます。しかし、どの変数が同期されますか? v を volatile と宣言すると、同期される変数はそれだけではないと思います。ただし、スレッド キャッシュ内のその他の (またはすべての) 変数も同期されます。スレッド スタックは、呼び出されたメソッドごとに複数のフレームで構成されます。先に進み、すべてのフレームを同期しますか? 同期ブロックはオブジェクト内のすべての変数を同期しますか?
2 に答える
0
変数を読み取るとき、volatile
すべての JVM の約束は、その変数には、任意のスレッドによって書き込まれた最新の値が含まれているということです。
舞台裏では、読み取りが発生する前にシステムがすべてのスレッドの RAM への完全なキャッシュ フラッシュを引き起こしている可能性がありますが、これは指定されていないため、発生する場合と発生しない場合があります。
したがって、要約すると、すべてのフレームである可能性がありますが、アクセスされる変数が含まれます。
Brian Goetz の優れたJava の理論と実践: Managing volatility を参照してください。次のようなコメントが表示されます。
... スレッドは、揮発性変数の最新の値を自動的に認識します。
ここで重要な点は、volatile
変数はそれ以上のものではないということです。これらはキャッシュ フラッシュ メカニズムではありませんが、目的を達成するためにキャッシュ フラッシュを使用します。
于 2013-10-31T23:08:54.170 に答える