出版

マルチスレッド アプリケーションを作成するときに、クラス内の特定のデータへのアクセスを制御する必要がある場合は、volatile キーワードを使用して synchronized キーワードを使用した場合と同様の効果を得る方法を確認してください。
マルチスレッドアプリケーションを作成する際、クラス
内の特定のデータへのアクセスを制御しなければならない場合があります
。synchronizedキーワードを使えばこの目的を達成できることはご存知かもしれませんが、
volatileキーワードを使えば、synchronizedキーワードのオーバーヘッドを一切かけずに同様の効果が得られること
をご存知ない方もいるかもしれません
。
複数のスレッドが同じ
変数にアクセスする場合、JVMは各スレッドに
変数のコピーを保持することを許可する場合があります(おそらくそうするでしょう)。あるスレッドによる変数の変更は、
他のスレッドに反映される場合とされない場合があります。volatileキーワードを使用すると、
基本的に変数へのアクセスが同期されます。volatile
キーワードを使用して変数を宣言すると、JVMは、変数が変更される
たびに、その変数にアクセスするすべてのスレッドのコピーが更新されるようにする必要があります
。
スレッドが同期メソッドまたは
コードブロックを呼び出す場合、スレッドはオブジェクトのロックを取得する必要があります。
スレッドが同期コードから抜ける場合、ロックは解放される必要があります。
オブジェクトのロック取得と解放には時間と
リソースが必要です。volatile キーワードを使用すると、この
オーバーヘッドを回避できますが、volatile の使用にはコストがかかります。volatile
フィールドの値をすべてのスレッド間で同期させておくには、それなりのコストがかかります。Java
言語仕様の次の記述が最も適切だと思います。「フィールドを
volatile として宣言できます。その場合、スレッドは
変数にアクセスする
たびに、フィールドの作業コピーとマスターコピーを照合する必要があります。」
volatileキーワード
とsynchronizedメソッドのどちらを使用するかは
、アプリケーションごとに判断する必要があります。次回
データアクセスを同期する必要がある場合は、両方のオプションを検討し、どちらが
適切かを確認してください。
毎週木曜日に配信される無料のJavaニュースレターでは、このプログラミング言語の潜在能力を最大限に引き出すために必要な洞察と実践的なヒントをお届けします。今すぐ登録して、今すぐ始めましょう!

デビッド・ペータースハイム