ConcurrentlinkQueue源码中的cas操作

首先看下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);

    }

我们看到其中有个casItem的方法调用了UNSAFE.compareAndSwapObject(this, itemOffset, cmp, val);

 

1、什么是CAS操作?

 CAS:Compare and Swap, 翻译成比较并交换。 

    java.util.concurrent包中借助CAS实现了区别于synchronouse同步锁的一种乐观锁。

 

你可能感兴趣的:(java)