AQS(AbstractQueuedSynchronizer)

2020-03-18  本文已影响0人  抬头挺胸才算活着

全称是 AbstractQueuedSynchronizer,是阻塞式锁和相关的同步器工具的框架

特点:

子类主要实现这样一些方法(默认抛出 UnsupportedOperationException)

可以看到下面的函数只剩下获取锁和释放锁的逻辑
tryAcquire
tryRelease
tryAcquireShared
tryReleaseShared
isHeldExclusively
获取锁的姿势

// 如果获取锁失败
if (!tryAcquire(arg)) {
// 入队, 可以选择阻塞当前线程 park unpark
}

释放锁的姿势

// 如果释放锁成功
if (tryRelease(arg)) {
// 让阻塞线程恢复运行
}

AQS的功能

AQS实现了阻塞版本获取锁acquire
获取锁超时机制
通过打断取消机制
独占机制和共享机制
条件不满足的等待机制

AQS基本思想

获取锁的逻辑

while(state 状态不允许获取) {
if(队列中还没有此线程) {
    入队并阻塞
  }
}
当前线程出队

释放锁的逻辑

if(state 状态允许了) {
  恢复阻塞的线程(s)
}

AQS设计

  1. state 设计
  1. 阻塞恢复设计
  1. 队列设计
    private AbstractQueuedSynchronizer.Node enq(AbstractQueuedSynchronizer.Node node) {
        while(true) {
            AbstractQueuedSynchronizer.Node oldTail = this.tail;
            if (oldTail != null) {
                node.setPrevRelaxed(oldTail);
                if (this.compareAndSetTail(oldTail, node)) {
                    oldTail.next = node;
                    return oldTail;
                }
            } else {
                this.initializeSyncQueue();
            }
        }
    }

AQS使用

ReentrantLock

共享锁的释放跟独占锁不一样

因为共享锁可能有多个线程一起释放,所以要考虑同步的问题。

上一篇 下一篇

猜你喜欢

热点阅读