参考書:「Javaの並行プログラミングの芸術」 - 暁明牙Tengfei魏Pengcheng
並行プログラミングでは、同期および揮発性の二つのキーワードが重要な役割を果たし、軽量の同期揮発性、それはマルチプロセッサの開発における共有変数の「可視性」を保証します。
だから、「可視性」を意味は何ですか?
視認性は、スレッドが共有変数を変更したときに、別のスレッドがこの変形の値を読み取ることができることを意味します
揮発性が適切に使用した場合、それは、同期のコストよりも低くなり、それが閉塞スレッドを起こさないため、コンテキストスイッチとスケジューリング、その優れたパフォーマンス、低コストにつながることはありません。
揮発性の定義
揮発性のJava言語仕様バージョン3の定義は次のとおりです。
Javaプログラミング言語だけでは、この変数を取得するために排他ロックを保証しなければならない共有変数を確保するために、正確かつ一貫スレッドによって更新することができ、スレッドが共有変数にアクセスすることができます。
Javaは揮発性の提供、およびいくつかのケースではロックよりも便利であることを。
フィールドがvolatile宣言されている場合は、Javaのスレッドメモリモデル(JMM)は、すべてのスレッドがこの変数の値が同じである見ることを確認します。
揮発性の原則
簡単な例を見てください:
private volatile Singleton instance = null;
public Singleton getInstance(){
if(instance == null){
instance = new Singleton();
}
return instance;
}
このメンバー変数のインスタンスは、揮発性のキーワードを変更しているので、例えば、基準は、各スレッドが変更され、「目に見えます」。だから、揮発性のそれの視認性を確保する方法ですか?
私たちは、(このコードは次のとおりです。揮発性書き込み操作、CPUは何でもしますときに表示するためにアセンブリ命令を生成することにより、x86プロセッサにおけるJITコンパイラツールを取得しますinstance = new Singleton();
)。
次のようにアセンブリコードに変換します:
0x01a3deld: movb $0x0,0x1104800(%esi);0x01a3de24: lock add1 $0x0,(%esp);
揮発性変数は、共有変数の書き込み動作は、アセンブリコードの2行目の複数であろうと、マルチコアプロセッサにおけるロックプレフィックス命令は、2つの事柄につながるが修正されます。
- 現在のデータプロセッサのキャッシュラインは、システム・メモリに書き戻されます。
- このメモリは、メモリアドレスのデータが有効でない他のCPUのキャッシュに書き戻します。
これは、共有変数の「可視性」を確保するために、このような揮発性これら二つの追加のイベントです。