クリティカルセクションにミューテックスロックがあると、複数のスレッドがクリティカルセクションを台無しにすることはできませんが、なぜ同じものに揮発性変数が必要になるのでしょうか。
次のコードに揮発性の単語がない場合はどうなりますか?
クリティカルセクションにミューテックスロックがあると、複数のスレッドがクリティカルセクションを台無しにすることはできませんが、なぜ同じものに揮発性変数が必要になるのでしょうか。
次のコードに揮発性の単語がない場合はどうなりますか?
キーワードはvolatile
ロックを提供しません。
その目的は、スレッドが古いデータをチェックする可能性があるように、値を「キャッシュ」するコンパイラーの最適化を防ぐことです。
揮発性は言語間で微妙に異なり、常に少し問題になります。仕様を注意深く読み、信頼できる例に従ってください。
volatile キーワードを使用すると、ダブル チェック ロックが 1.5 以降の JVM で正しく機能します。そのページの「新しい Java メモリ モデルの下」セクションを参照してください。
volatile キーワードがない場合、1.5 以降の JVM で 2 つのインスタンスが作成される可能性があります。1.5 より前の JVM では、ダブル チェック ロックは完全に壊れていると見なされるため、使用しないでください。
ただし、シングルトンを初期化する場合、通常、二重チェック ロックの使用は価値がないと見なされ、単純な静的初期化で十分です。シングルトンがある時点でアプリケーションによって初期化されることが確実にわかっている場合、遅延インスタンス化は冗長です。ただ行きます:
private static Singleton s_instance = new Singleton()
または C++ に相当するものは何でも。キレイで安心!
この質問は Java と C++ のややもつれた混乱になってしまったので、上記の Java について言及していることに注意してください。C++ には synchronized キーワードがなく、volatile は同時実行には適用されません。