JAva volatile適用シーン

1033 ワード

volatileの知識の回顧:
  • 書き込み:変数を書き込むときは、メインメモリに直接書き込み、他のスレッドのローカルメモリを無効にします.
  • 読み出し:読み出し時に直接読み出したメインメモリまたは無効なローカルメモリ;以上の説明は不正確であるが、主な構想はOKであり、構想はキャッシュ設計と異曲同工
  • である.
    本編では知識科学普及を行わず、詳しくは説明しません.volatileの応用シーンを見てみましょう.
  • マルチリードシーンを書くこのようなシーンは、2つのスレッドが同時に変数を書くことによって変数が正しくないことを考慮する必要はありませんが、リアルタイム性を考慮する必要があります.この場合は一般的に信号として使用するが、volatileで変数を識別しなければ、スレッドAが変数を書き込み、更新した後、残りのB/C/D/E....スレッドは、適切に最新の値が読めることを保証しないが、volatileを加えた後、必ず最新の値が読めることを保証し、信号伝達の効率を保証した.

  • 2.楽観ロックシーン典型的な楽観ロックを見てみましょう(疑似コード、実行できません.この操作は一般的にUnsafeクラスを呼び出して操作します.原子的な操作はjava.util.concurrent.atomicを使用して、自分で楽観ロックを書かなくてください)
    public class VolatileTest {
        private volatile int a = 0;
    
        public static void main(String[] args){
            int expect ;
            do{
                expect = a;
            }while (!compareAndSet(expect, expect+1));
        }
    }
    

    a変数を識別するためにvolatileがなければ、expect = a;の行は最新の値を読むのにより多くの時間がかかるが、楽観ロックはずっと空転しているので、N回以上空転し、素晴らしいCPUリソースを無駄にしているvolatileは楽観ロックシーンで意義が大きいことが分かる.