AbstractQueuedSynchronizer源码分析

5次阅读

共计 1308 个字符,预计需要花费 4 分钟才能阅读完成。

概述

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;
    }

正文完
 0