全称为:AbstractQueuedSynchronizer
属性部分:
private volatile int state;
通过volatile保证state可见性,int实现非独占锁。
private transient volatile Node head;
private transient volatile Node tail;
放排队等待线程的 队列(FIFO) 的 头结点和尾结点
如何利用state和FIFO等待队列来管理多线程的同步状态?
应该实现的两个操作:
1. 尝试获取锁(修改标记位),立即返回 ===== > tryAcquire
protected boolean tryAcquire(int arg) {
throw new UnsupportedOperationException();
}
- 传入int型参数,表示对state的修改;
- 返回boolean型参数,表示修改是否成功;
表示如果想继承AQS类,就可以重写该方法,不然就会返回不支持的异常。
2. 获取锁(修改标记位),愿意进入队列等待,直到获取 ===== >acquire
public final void acquire(int arg) {
if (!tryAcquire(arg) &&
acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
selfInterrupt();
}
final修饰:所有继承类都直接调用这个方法,并且不能被override
- tryAcquire:如果能直接获取锁,则跳出
- acquireQueued方法:
- addWaiter:将当前线程封装为一个Node,并加入等待队列,返回值为新建的结点对象。
- acquireQueued方法: