1

たとえば、マルチスレッド環境に静的フィールドがあります(多くのスレッドがこの変数を使用します):

public static int value;

volatile発生前の関係を確立するために宣言に追加する必要がありますか?

4

2 に答える 2

3

インスタンスの関連付けは、同時変更と直交しています。

複数のスレッドを介して静的な値にアクセスする場合、各スレッドはローカルにキャッシュされたコピーを持つことができますこれを回避するには、変数を静的な揮発性として宣言できます。これにより、スレッドはグローバル値のたびに読み取りを強制されます

于 2013-02-26T10:07:02.537 に答える
2

はい、それはそれを行う1つの方法になります。別の方法は、同期されたメソッドのみを使用してアクセスすることです。

揮発性フィールドは、スレッド間で状態を通信するために使用される特別なフィールドです。揮発性の読み取りごとに、任意のスレッドによるその揮発性への最後の書き込みが表示されます。事実上、これらはプログラマーによって、キャッシュまたは並べ替えの結果として「古い」値を表示することは決して受け入れられないフィールドとして指定されます。コンパイラとランタイムは、それらをレジスタに割り当てることを禁止されています。また、書き込まれた後、キャッシュからメインメモリにフラッシュされ、他のスレッドからすぐに見えるようにする必要があります。同様に、揮発性フィールドが読み取られる前に、キャッシュを無効にして、ローカルプロセッサキャッシュではなくメインメモリの値が表示されるようにする必要があります。揮発性変数へのアクセスの並べ替えにも追加の制限があります。

http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#volatile

発生前の関係に加えて原子性も必要な場合は、この質問への回答を読んでください:Java:静的揮発性変数を使用する正しい方法はありますか?

于 2013-02-26T10:05:45.787 に答える