volatile 型変数はどのような保証を提供しますか?

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 などのアトミック クラスの使用を検討してください。

おすすめ

転載: blog.csdn.net/cz_00001/article/details/132693123