javaのvolatileキーワードとは何か、主な機能、同期ブロックでの使用方法、ブロックから完全に削除するとどうなるか教えてください。
2 に答える
Javaの揮発性変数とは何かから始めましょう:
Java の Volatile キーワードは、この変数の値をキャッシュせず、常にメイン メモリから読み取る Java コンパイラとスレッドへのインジケータとして使用されます。
メモリから変数値を読み取る利点は何ですか。次のサンプル コードを検討してください。
public class Singleton{
private static volatile Singleton _instance; //volatile variable
public static Singleton getInstance(){
if(_instance == null){
synchronized(Singleton.class){
if(_instance == null)
_instance = new Singleton();
}
}
return _instance;
}
前のサンプルでは:
1) インスタンスを作成するのは一度だけです
2) 最初のリクエストが来た時点で遅延してインスタンスを作成しています。
_instance 変数を volatile にしないと、Singleton のインスタンスを作成しているスレッドは他のスレッドと通信できません。そのインスタンスは、Singleton ブロックから出るまで作成されているため、スレッド A が Singleton インスタンスを作成していて、作成直後の場合CPU を失った場合、他のすべてのスレッドは _instance の値を null ではないと認識できず、まだ null であると認識します。
結論:
volatile キーワードがより便利になります。複数のスレッドが同じ変数を使用する場合、各スレッドはその変数のローカル キャッシュの独自のコピーを持ちます。したがって、値を更新するときは、実際にはメイン変数メモリではなくローカル キャッシュで更新されます。同じ変数を使用している他のスレッドは、別のスレッドによって変更された値について何も知りません
Java の Volatile キーワードは、この変数の値をキャッシュせず、常にメイン メモリから読み取る Java コンパイラとスレッドへのインジケータとして使用されます。