java

JUC.AQS

2019-06-03  本文已影响0人  小明17

AQS : AbstractQueuedSynchronizer

AQS内部维护一个FIFO队列来完成获取锁线程的排队工作。底层是一个双向链表(队列的一种实现)

过程: 未获取到锁的线程会利用CAS操作线程安全的加入到队列尾部,队列头部的线程是获取到同步状态(锁)的线程。队列头部的线程在完成任务释放锁后会唤醒它的后继,后继会在获取锁成功后把自己设置为头节点。(CAS+死循环)
多个线程都通过CAS+死循环的方式来对队列进行修改,每次能够保证只有一个成功,如果是N个线程,那每个线程最多loop N次 。

由于state的更新只影响了队列头部一个线程,避免了群羊效应

主要方法:

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;

}

AQS的常用子类:

http://www.importnew.com/21889.html 这篇文章是介绍前三种的

上一篇 下一篇

猜你喜欢

热点阅读