Loading...
墨滴

飞翼

2021/06/04  阅读:39  主题:雁栖湖

AQS原理分析

Part1什么是AQS

jdk11解释

  • AQS叫全名叫抽象队列同步器(AbstractQueuedSynchronizer)
  • state+CLH队列
  • 采用FIFO(先进先出)

如果共享资源被占用,就需要一定的阻塞等待唤醒机制来保证锁的分配。这个机制主要用的是CLH队列的变体实现的,将暂时获取不到锁的线程加入到队列中,这个队列就是AQS的抽象表现。它将请求共享资源的线程封装成队列的结点(NODE),通过CAS、自旋、LockSupport.park()的方式,维护STATE变量的状态,使并发达到同步的控制效果。

示例:

Part2源码分析(ReentrantLock)

  final void lock() {
            //1 判断当前队列状态,0 可用 1 不可用 如果可用把当前线程设置为可用状态 
            if (compareAndSetState(01))
                setExclusiveOwnerThread(Thread.currentThread());
            else
                //2 否则进入等待队列
                acquire(1);
        }
public final void acquire(int arg) {
        //3 在加入等待队列前先尝试是否;可执行 否则使用双向链表加入队列
        if (!tryAcquire(arg) &&
            acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
            selfInterrupt();
    }
 final boolean acquireQueued(final Node node, int arg) {
        boolean failed = true;
        try {
            boolean interrupted = false;
            for (;;) {
                final Node p = node.predecessor();
                if (p == head && tryAcquire(arg)) {
                    setHead(node);
                    p.next = null// help GC
                    failed = false;
                    return interrupted;
                }
                if (shouldParkAfterFailedAcquire(p, node) &&
                    parkAndCheckInterrupt())
                    interrupted = true;
            }
        } finally {
            if (failed)
                cancelAcquire(node);
        }
    }

飞翼

2021/06/04  阅读:39  主题:雁栖湖

作者介绍

飞翼