Jdk 1.6 JUCソース解析(4)-atomic Stopedireference、AtomicMarcable Reference


Jdk 1.6 JUCソース解析(4)-atomic Stopedireference、AtomicMarcable Reference
作者:大飛
 
機能概要:
  • CAS中のABA問題を回避するために、AtomicStopedereferenceとAtomicMarcable Referenceの二つの種類を提供します。前者は「参照、integer」の二元グループに相当し、後者は「引用、bollan」の二元グループに相当する。
  • AtomicStation referenceは、バージョン番号付き原子参照として使用することができ、AtomicMarcable Referenceは、削除されたノードを表すために使用することができる。
  •        注:ABA問題はCASの操作中に目標値を1から2に変更したいと仮定していますが、一般的には1かどうかの検査対象値です。1の場合は2に設定します。しかし、検出前に目標値が3になり、また1になった可能性があります。検出過程では、このような変化を察知することはできません。これは普通は影響がありませんが、場合によっては問題になるかもしれません。
     
    ソース分析:
  • まずAtomicStation referenceの内部構造を見てください。
  • public class AtomicStampedReference<V>  {
        private static class ReferenceIntegerPair<T> {
            private final T reference;
            private final int integer;
            ReferenceIntegerPair(T r, int i) {
                reference = r; integer = i;
            }
        }
        private final AtomicReference<ReferenceIntegerPair<V>>  atomicRef;
        /**
         * Creates a new {@code AtomicStampedReference} with the given
         * initial values.
         *
         * @param initialRef the initial reference
         * @param initialStamp the initial stamp
         */
        public AtomicStampedReference(V initialRef, int initialStamp) {
            atomicRef = new AtomicReference<ReferenceIntegerPair<V>>
                (new ReferenceIntegerPair<V>(initialRef, initialStamp));
        }
            これは、AtomicStation reference内部では、ReferenceIntegerPairを引用して、AtomicReferenceを使用して、この引用を原子更新することができます。
     
           AtomicMarcable Referenceでも同様の構造です。
    public class AtomicMarkableReference<V>  {
        private static class ReferenceBooleanPair<T> {
            private final T reference;
            private final boolean bit;
            ReferenceBooleanPair(T r, boolean i) {
                reference = r; bit = i;
            }
        }
        private final AtomicReference<ReferenceBooleanPair<V>>  atomicRef;
        /**
         * Creates a new {@code AtomicMarkableReference} with the given
         * initial values.
         *
         * @param initialRef the initial reference
         * @param initialMark the initial mark
         */
        public AtomicMarkableReference(V initialRef, boolean initialMark) {
            atomicRef = new AtomicReference<ReferenceBooleanPair<V>> (new ReferenceBooleanPair<V>(initialRef, initialMark));
        }
     
           他のコードは分かりやすいです。ここでは具体的な分析はしません。
           
           ソースコードはここまで分析します。
     
           参照:Jdk 1.6 JUCソース解析(1)-atomicXXX