是什么?
AQS是队列同步器(AbstractQueueSynchronizer),是用来构建锁和完成其他同步组件的基本框架,再lock里面,很多的方法都将用到AQS以获取同步状态,实现锁的语义,而不是依靠传统的synchronized中的对象进行锁获取与释放。
AQS的核心思想
AQS的核心思想是基于volatile int state这样的一个属性同时配合Unsafe工具对其原子性的操作来实现对当前锁的状态进行修改。当state的值为0的时候,标识改Lock不被任何线程所占有
AQS如何解决“羊群效应”
“羊群效应”指的是很多的线程在竞争同一个资源或锁的时候,最后只能由一个线程获得锁,这个获取资源或锁的过程中,就会造成资源的浪费。
AQS采用一个FIFO的同步队列的数据结构,每个节点只需要关心上一个前驱节点的状态,线程唤醒也只唤醒头节点中等待的线程。与其让这些线程相互竞争,还不如它们安排好顺序一个一个来。
AQS的实现
同步队列
之前说的,AQS是采用的一中FIFO队列的数据结构,同步队列的指针里面包含指向头节点和伪结点的指针。而每个节点都是用来保存竞争线程的状态和信息的,节点的主要成员变量如下:
Node {
int waitStatus;
Node prev;
Node next;
Node nextWaiter;
Thread thread;
}
独占式同步状态的获取与释放
在获取同步状态的时候,同步器会维护一个同步队列,若获取成功,则直接退出acquire方法;若获取同步状态失败,就会将当前线程的信息添加到同步对列的队尾并在该队列中进行自旋以获得同步状态之后才退出acquire方法。
-
在释放同步状态的时候有,同步器会调用tryRelease方法释放通过不状态,接着唤醒同步队列中头节点的后继节点。
独占式同步状态的获取与释放源码分析
独占式同步状态的获取源码分析
//通过acquire方法获取同步状态,里面调用由子类实现的tryAcquire方法
//若获取失败就将该线程加入同步队列中继续自旋获取同步状态
public final void