原子型フィールド更新器AtomicXxxxFieldUpdater

3013 ワード

このブログシリーズは、同時プログラミングを学習する際の記録のまとめです.文章が多くて、書く時間もバラバラなので、ディレクトリシール(転送ドア)を整理して、調べやすいです.
同時プログラミングシリーズブログ転送ゲート

アトミックフィールド更新器

java.util.concurrent.atomicでは、原子型フィールド更新器には、次の3つがあります.
  • AtomicIntegerFieldUpdater:反射されたツールクラスに基づいて、指定されたオブジェクトの指定されたintタイプフィールドを原子的に更新できます.
  • AtomicLongFieldUpdater:反射されたツールクラスに基づいて、指定されたオブジェクトの指定されたlongタイプフィールドを原子的に更新できます.
  • AtomicReferenceFieldUpdater:反射されたツールクラスに基づいて、指定されたオブジェクトの指定された適用タイプフィールドを原子的に更新できます.

  • ルールの使用


    原子型フィールド更新器は内部でUnsafeクラスのnative法により動作の原子性を保証する.
    原子型フィールド更新器の使用については、次の点に注意してください.
  • フィールドは、可視性を保証するためにvolatileタイプである必要があります.
  • フィールドとフィールド更新器のアクセスタイプ(public/protected/private)は一致する必要があります.
  • フィールドはインスタンス変数のみであり、クラス変数(static)ではありません.
  • フィールドはfinalの変数ではありません.このようなフィールドは変更できません.
  • IntegerとLongタイプを処理する場合は、AtomicReferenceFieldUpdater
  • を使用する必要があります.

    列子の使用(AtomicIntegerFieldUpdaterを列とする)

    public class AtomicIntegerFieldUpdaterTest {
         private static AtomicIntegerFieldUpdater a = AtomicIntegerFieldUpdater.newUpdater(User.class, "old");
    
        public static void main(String[] args) {
            //  10 
            User conan = new User("conan",10);
            //  , 
            System.out.println(a.getAndIncrement(conan));
            //  
            System.out.println(a.get(conan));
        }
    
        public static class User {
            private String name;
            public volatile int old;
    
            public User(String name,int old) {
                this.name = name;
                this.old = old;
            }
    
            public String getName() {
                return name;
            }
    
            public int getOld() {
                return old;
            }
        }
    }

    メソッドの説明


    まず、上記の3つの原子型フィールド更新器の一般的な方法を学びます.これらの方法は以下の通りです.
  • コンストラクタ:パラメータなしprotectedのコンストラクタは1つしか使用できません.
  • newUpdater(fieldClass,fieldName):指定されたフィールドと指定されたタイプの原子型フィールド更新器インスタンスオブジェクトを作成および戻すための、原子型フィールド更新器が提供する静的汎用メソッド.
  • get(obj):原子性と可視性を有する値を付与します.
  • set(obj):原子性と可視性を有する値をとる.
  • lazySet(obj,newValue):付与され、原子性を有し、可視性を備えていない.
  • getAndSet(obj,newValue):原子性と可視性を持つ値を割り当て、古い値を返します.
  • compareAndSet(obj,expect,update):現在所望の値である場合、割り当てが成功したかどうかが返され、原子性と可視性があります.
  • weakCompareAndSet(obj,expect,update):compareAndSet(obj,expect,update)と似ています.

  • 原子型フィールド更新器の一般的な方法は、通常の原子型の一般的な方法と同様であり、唯一の違いは、obj(変更されたフィールドの属するオブジェクト)のパラメータが1つ増えたことである.
    AtomicIntegerFieldUpdaterとAtomicLongFieldUpdaterの独自の方法です.次の方法AtomicReferenceFieldUpdaterクラスにはありません.
  • getAndAdd(obj):原子性と可視性を持つ増分計算と古い値を返します.
  • addAndGet(obj):原子性と可視性を持つ増分計算と新しい値を返します.
  • getAndIncrement(obj):i++のように、原子性と可視性を有する古い値を自己増加して返します.
  • incrementAndGet(obj):原子性と可視性を有する++iのような新しい値を自己増加して返します.
  • getAndDecrement(obj):i--のような古い値を減算して返し、原子性と可視性を有します.
  • decrementAndGet(obj):原子性と可視性を有するiのような新しい値を自己減算して返します.