前言
AbstrarctQueuedSynchronizer 抽象队列同步器,是一个用于构建锁和同步容器的框架。ReentrantLock、ReentrantReadWriteLock、FutureTask
使用FIFO队列表示同步等待锁的线程,队列头节点被称为“哨兵节点”或“哑结点”,他与任何线程关联,其他节点与等待线程关联,每一个阶段维护一个等待状态 wait Status。
两种功能
独占锁和共享锁
独占锁:每次只能有一个线程持有锁 共享锁:运行有多个线程同时获得锁,并发访问共享资源
内部实现
AQS的实现依赖内部的同步队列,也就是FIFO的双向队列,如果当前线程竞争锁失败,那么AQS会把当前线程以及等待状态信息构造成一个Node加入队列,同时再阻塞该线程。当获取锁的线程释放线程后,会从队列中唤醒一个阻塞的节点。
添加线程对AQS队列的变化
- 队列操作的变化:新的线程封装成node节点追加到FIFO队列,设置Prev节点以及修改当前节点的前置节点的next节点指向自己。
- tail指向变化:通过同步器将tail重新指向新的尾部节点
释放锁移除节点对AQS队列的变化
当第一个head节点表示获取锁成功的节点,当头节点再释放同步状态时,会唤醒后继节点获取锁成功,会把自己设置为头节点。
- head 节点指向:修改head节点指向下一个获得锁的节点
- 新的获得锁的节点:第二个节点被head指向了,此时将prev 指针指向null
AQS 与 ReentrantLock 的联系
ReentrantLock 有三个内部类:Sync、NonfairSync、FairSync 从继承关系来看,他们是基于AQS的