概述

AbstractQueuedSynchronizer,简称AQS,它提供了同步器框架的形象实现,ReentrantLock、Semaphore、CountDownLatch、CyclicBarrier等并发类均是基于AQS来实现的,具体用法是通过继承AQS实现其模板办法,而后将子类作为同步组件的外部类。

源码剖析

成员变量

head和tail节点

这俩个节点是Node类型的,前面会说先看代码

    //期待队列的头节点,惰性初始化。除了初始化外只能被setHead办法批改,并且节点的waitStatus不能为CANCELLED    private transient volatile Node head;    //期待队列的尾节点,惰性初始化,只会在调用enq办法增加期待节点时批改    private transient volatile Node tail;

state

AQS维持了一个繁多的volatile的state变量,并通过unsafe办法来原子性的获取和设置该值

/**     * The synchronization state.     */    private volatile int state;    protected final int getState() {        return state;    }    protected final void setState(int newState) {        state = newState;    }        protected final boolean compareAndSetState(int expect, int update) {        // See below for intrinsics setup to support this        return unsafe.compareAndSwapInt(this, stateOffset, expect, update);    }

spinForTimeoutThreshold

static final long spinForTimeoutThreshold = 1000L;

实现办法

 private Node enq(final Node node) {        for (;;) {            Node t = tail;            //第一次入队,head和tail都为null            if (t == null) { // Must initialize                //原子设置头节点                if (compareAndSetHead(new Node()))                    tail = head;            } else {                node.prev = t;                //原子设置尾节点                if (compareAndSetTail(t, node)) {                    t.next = node;                    return t;                }            }        }    }

应用传入的mode节点来让以后线程入队

 private Node addWaiter(Node mode) {        Node node = new Node(Thread.currentThread(), mode);        // Try the fast path of enq; backup to full enq on failure        Node pred = tail;        if (pred != null) {            node.prev = pred;            if (compareAndSetTail(pred, node)) {                pred.next = node;                return node;            }        }        enq(node);        return node;    }