ConcurrentlinkQueue<br>ソースコードのcas操作

1805 ワード

まずConcurrentQueueでのNodeの定義を見てみましょう
private static class Node<E> {
        private volatile E item;
        private volatile Node<E> next;

        Node(E item) {
            // Piggyback on imminent casNext()
            lazySetItem(item);
         } 

        E getItem() {
            return item;
        }

        boolean casItem(E cmp, E val) {
            return UNSAFE.compareAndSwapObject(this, itemOffset, cmp, val);
        }

        void setItem(E val) {
             item = val;
        }

        void lazySetItem(E val) {
            UNSAFE.putOrderedObject(this, itemOffset, val);
        }

        void lazySetNext(Node<E> val) {
            UNSAFE.putOrderedObject(this, nextOffset, val);
        } 

        Node<E> getNext() {
            return next;
        }

        boolean casNext(Node<E> cmp, Node<E> val) {
            return UNSAFE.compareAndSwapObject(this, nextOffset, cmp, val);
        }

        // Unsafe mechanics

        private static final sun.misc.Unsafe UNSAFE =
        sun.misc.Unsafe.getUnsafe();
        private static final long nextOffset =
        objectFieldOffset(UNSAFE, "next", Node.class);
        private static final long itemOffset =
        objectFieldOffset(UNSAFE, "item", Node.class);

    }

中にはUNSAFEを呼び出すcasItemの方法がある.compareAndSwapObject(this, itemOffset, cmp, val);
 
1、CAS操作とは何ですか.
CAS:Compare and Swap、比較して交換します. 
    java.util.concurrentパッケージでは、synchronouse同期ロックとは異なる楽観的なロックがCASによって実現される.