#Java—多线程7 Lock2—深入理解AQS
##独占锁的获取
非公平锁
1.模板方法aquire(int arg)
public final void acquire(int arg) {
//调用tryAcquire再次尝试获取锁,如果成功直接退出
//如果失败,首先调用addWaiter将钱财封装成结点入同步队列,
if (!tryAcquire(arg) &&
acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
selfInterrupt();
}
**tryAcquire(arg)-------:**再次使用CAS尝试获取同步状态,若成功方法直接返回,当前线程置为持有锁状态,
如果失败,调用
addWaiter(Node.EXCLUSIVE), arg)————将当前线程封装成Node结点后尾插入同步队列
//Creates and enqueues node for current thread and given mode.
//将当前的线程封装成结点入队
private Node addWaiter(Node mode) {
//1.将当前线程以指定模式(独占式、共享式)封装成Node结点
Node node = new Node(Thread.currentThread(), mode);
// Try the fast path of enq; backup to full enq on failure
//2.拿到当前队列的尾结点
Node pred = tail;
//当前队列不为空
if (pred != null) {
node.prev = pred;
//将当前节点使用CAS尾插入同步队列
if (compareAndSetTail(pred, node)) {
pred.next = node;
return node;
}
}
//当前队列为空或CAS尾插失败是调用enq
enq(node);
return node;
}
mode:表示锁时什么模式,是独占式还是共享式。
enq()————当同步队列为空时,完成队列的初始化操作,以及不断CAS将当前节点未插入同步队列
private Node enq(final Node node) {
//不断自旋
for (