Java AtomicReferenceFieldUpdaterオブジェクト属性原子更新器

3343 ワード

AtomicReferenceFieldUpdaterはjava合併フレームワークの大神Doug Leaの手から出た.この兄はjavaを基本的に受け入れている.util.concurrentパッケージの開発には、感心させられます.本文はソースコードと注釈を調べる理解から来た.さらにJUCは3つの原子更新器を提供します.
  • 1.AtomicIntegerFieldUpdater
  • 2.AtomicLongFieldUpdater
  • 3.AtomicReferenceFieldUpdater

  • ソースコードをよく見ると、AtomicIntegerとAtomicIntegerFieldUpdaterの共通APIはほぼそっくりなので、CAS操作を提供するという面では、両者はほぼ等価であることがわかります.
    このクラスの用途
     * A reflection-based utility that enables atomic updates to
     * designated {@code volatile} reference fields of designated classes.  
    

    簡単に言えば,AtomicReferenceFieldUpdaterエネルギー原子はクラス内のvolatileによって修飾された変数を更新する.原理は,反射によりフィールドの原子更新を実現することである.では問題ですが、反射の性能が低いため、なぜAtomicIntegerを直接使わずにvolatile+AtomicIntegerFieldUpdaterを使うのでしょうか.コメントの説明は次のとおりです.
    This class is designed for use in atomic data structures  
    in which several reference fields of the same node are  
    independently subject to atomic updates. 
    

    このクラスは複数の属性原子を更新することができ,実際にはAtomicIntegerもサポートする.もちろんAtomicXFiledUpdaterは役に立たないわけではありませんが、原子類に対して、次のような利点があります.
  • 1、AtomicXは結局複雑なタイプで、空間占有量はvolatileの元のタイプより大きく、超大数のシーンの下で、AtomicXFieldUpdaterはメモリ占有の面で優位である.
  • 2、あるフィールドのすべての操作が原子操作である場合、AtomicXを使用することができるが、あるシーンでは、フィールドには原子操作が必要である---3、通常の操作が必要である場合、AtomicXFieldUpdaterを使用することを考慮することができる.
  • 4、原子を更新するフィールドがサードパーティクラスにある場合、ソースコードを直接変更できない場合は、AtomicXFieldUpdaterを使用します.

  • インスタンス化
        public static  AtomicReferenceFieldUpdater newUpdater(Class tclass,
                                                                        Class vclass,
                                                                        String fieldName) {
            return new AtomicReferenceFieldUpdaterImpl
                (tclass, vclass, fieldName, Reflection.getCallerClass());
        }
    

    構築方法は空の構築であり、アクセス権はprotectedであり、外部パケットのクラスが作成できないことを示し、正しい姿勢:静的メソッドnewUpdaterの作成を呼び出す.
  • 最初のパラメータtclassは参照クラスを表し、属性を持つクラスを表す.
  • の2番目のパラメータvclassは、属性のタイプを表します.
  • の3番目のパラメータfieldNameは、クラス反射でこの属性を見つけることができる属性の名前を表します.

  • ケース
    public class Node {
        private volatile Node left;
        private volatile Node right;
    
        private static final AtomicReferenceFieldUpdater leftUpdater =
                AtomicReferenceFieldUpdater.newUpdater(Node.class, Node.class, "left");
    
        private static final AtomicReferenceFieldUpdater rightUpdater =
                AtomicReferenceFieldUpdater.newUpdater(Node.class, Node.class, "left");
    
        public Node getLeft() {
            return left;
        }
    
        public boolean compareAndSetLeft(Node expect, Node update) {
            return leftUpdater.compareAndSet(this, expect, update);
        }
    }
    

    けっかん
     * 

    Note that the guarantees of the {@code compareAndSet} * method in this class are weaker than in other atomic classes. * Because this class cannot ensure that all uses of the field * are appropriate for purposes of atomic access, it can * guarantee atomicity only with respect to other invocations of * {@code compareAndSet} and {@code set} on the same updater.


    すなわち,原子更新器のCASは対応する原子クラスよりも弱く,同じupdaterインスタンスによるフィールドの更新が原子であることしか保証できず,以下のシナリオでは原子性を保証できない.
  • 1、同時に複数のupdaterを使用する.
  • 2、updaterのほか、通常の更新操作(同時処理なし)も使用する.