Volatile変数を使用するか、原子変数を使用するか


  • volatile変数
  • Java言語ではvolatile変数は軽量レベルの同期メカニズムを提供し、volatile変数は変数の更新操作を他のスレッドに通知するために使用され、volatile変数はレジスタや他のプロセッサに見えない場所にキャッシュされないため、volatile変数を読み取ると最新の書き込み値が返されます.volatile変数は、通常、ステータスIDを表すために使用されます.
  • 原子変数:
  • 原子変数は「より強力なvolatile」変数であり、実装から見ると、各原子変数クラスのvalue属性はvolatile変数であるため、volatile変数の特性原子変数もある.同時に、原子変数は、読み取り、変更、書き込みの原子操作を提供し、より強く、一般的な同時シーンのニーズに合致します.
    原子変数がより強い以上、volatile変数を使用する必要がありますか?volatile変数をいつ選択し、原子変数をいつ選択しますか?もちろん、この選択はマルチスレッドが同時発生するシーンでのみ発生しますが、マルチスレッドが同時発生する目的は、スループットの向上と遅延応答の低減にあるので、まずセグメントテストコードと実行結果を見てみましょう.
    import java.util.concurrent.CountDownLatch;
    import java.util.concurrent.atomic.AtomicInteger;
    public class TestVolatile {
        private static int CALC_TIME = 1000;
        private static final int THREAD_NUM = 100;
        private AtomicInteger ai;
        private int i;
        private volatile int vi;
                                                                                                                                                                                                              
        public TestVolatile(){
            ai = new AtomicInteger(0);
            i = 0;
            vi = 0;
        }
        public static void main(String[] args) throws InterruptedException {
            System.out.println("Calculation Times:" + CALC_TIME + " ----------------------");
            test();
                                                                                                                                                                                                                  
            CALC_TIME = 10000;
            System.out.println("Calculation Times:" + CALC_TIME + " ----------------------");
            test();
                                                                                                                                                                                                                  
            CALC_TIME = 100000;
            System.out.println("Calculation Times:" + CALC_TIME + " ----------------------");
            test();
                                                                                                                                                                                                                  
            CALC_TIME = 1000000;
            System.out.println("Calculation Times:" + CALC_TIME + " ----------------------");
            test();
        }
        private static void test() throws InterruptedException {
            testAi();
                                                                                                                                                                                                                  
            testI();
                                                                                                                                                                                                                  
            testVi();
        }
        private static void testAi() throws InterruptedException {
            TestVolatile testVolatile = new TestVolatile();
            CountDownLatch begSignal = new CountDownLatch(1);
            CountDownLatch endSignal = new CountDownLatch(THREAD_NUM);
            for (int i = 0; i  
      

    Calculation Times:1000 ----------------------
    Total time consumed by atomic increment : 8
    Total time consumed by synchronized increment : 6
    Total time consumed by volatile increment : 5
    Calculation Times:10000 ----------------------
    Total time consumed by atomic increment : 23
    Total time consumed by synchronized increment : 24
    Total time consumed by volatile increment : 15
    Calculation Times:100000 ----------------------
    Total time consumed by atomic increment : 354
    Total time consumed by synchronized increment : 360
    Total time consumed by volatile increment : 148
    Calculation Times:1000000 ----------------------
    Total time consumed by atomic increment : 3579
    Total time consumed by synchronized increment : 3608
    Total time consumed by volatile increment : 1519

    △ のプログラムに があるのではないかと っていますが、しばらく が つからないので、レンガを ってください.
    から, の はsynchronizedと の が く, が じられず,volatile は の (もちろん++ は がある)を させるため,volatile が を たすならvolatile を に し, に ぐ.では、volatile はいつ できますか? が するベストプラクティスは、 の3つの を に たすことです.
  • の き み は、 の の に する、または、 の
  • が スレッドのみ されることを する.
  • が の と に を しない
  • .
  • へのアクセス に
  • をロックする はありません.
    :
    を たす はvolatileブール , のデータ は を いる.