Java では、変数の変更に volatile キーワードが使用され、可視性と順序が保証されます。具体的には、volatile キーワードで修飾された変数には次の特性があります。
1. 可視性
スレッドが揮発性変数の値を変更すると、他のスレッドはその変更をすぐに確認できます。これは、揮発性変数の値が直ちにメイン メモリに書き込まれ、読み取られるときにメイン メモリから最新の値がフェッチされるためです。
2. 注文
マルチスレッド環境では、スレッドの命令が並べ替えられる場合があり、これにより一部の命令の実行順序が変更される場合があります。ただし、 volatile キーワードを使用して変数を変更すると、命令の並べ替えが禁止され、代入操作の順序が保証されます。
次に、volatile キーワードの使用を示す簡単なコード例を示します。
public class VolatileExample {
private volatile boolean flag = false;
public void writer() {
flag = true; // 修改volatile变量的值
}
public void reader() {
while (!flag) {
// 等待flag的值变为true
}
System.out.println("Flag is now true.");
}
}
上の例では、書き込みスレッドと読み取りスレッドの 2 つのスレッドがあります。書き込みスレッドは、writer メソッドを呼び出してフラグ変数を true に設定し、読み取りスレッドは、reader メソッドを呼び出してフラグの値が true になるのを待って、対応するメッセージを出力します。
フラグ変数は揮発性として宣言されているため、フラグへの変更は読み取りスレッドに表示されます。書き込みスレッドが flag の値を true に変更すると、読み取りスレッドは直ちにその変更を確認し、対応するメッセージを出力します。
volatile は可視性と順序性を保証しますが、アトミック性は保証しないことに注意してください。アトミック操作が必要な場合は、java.util.concurrent.atomic パッケージ内の AtomicBoolean などのアトミック クラスの使用を検討してください。