一、AQS数据结构
AQS(AbstractQueuedSynchronizer 抽象队列同步器)数据结构如下:
1、state 属性用来表示资源的状态(分独占模式和共享模式)。子类通过定义如何维护这个状态,从而控制如何获取锁和释放锁;
2、提供了基于 FIFO 的等待队列,类似于 Monitor 的 EntryList
3、条件变量来实现等待、唤醒机制,支持多个条件变量,类似于 Monitor 的 WaitSet
图2 带condition的AQS图
二、AQS的公平锁与非公平锁区别
1、公平锁是FIFO
final void lock() {
acquire(1); //竞争锁处理逻辑
}
2、非公平锁是在竞争锁之前,先尝试获取下锁,对应代码如下
final void lock() {
//竞争锁之前,先尝试获取锁(不一定成功)
if (compareAndSetState(0, 1))
setExclusiveOwnerThread(Thread.currentThread());
else
acquire(1);
}
三、其他待补充