AQS是一种并发数据结构,
- volatile int state
- blockingQueue工作队列
以acquire为例分析相关代码
public final void acquire(int i){
if(!tryAcquired()&&
acquireQueued(addWaiter(Node.EXCLUSIVE),arg)){
selfInterrrupt();
}
}
tryAcquire()-以ReentrantLock的nonfairTryAcquire(int acquire)为例
获取当前state
if(state==0){
无人占用,则通过cas改变state状态,
成功后,重新设置锁的所有者;
return true;
}else{
if(当前线程=锁的所有者){
state+=1;设置state;
return true;
}
return false;
}
acquireQueued方法
final boolean acquireQueued(final Node node, int arg) {
boolean interrupted = false;
try {
for (;;) {// 循环
final Node p = node.predecessor();// 获取前一个节点
if (p == head && tryAcquire(arg)) { // 如果前一个节点是头结点,表示当前节点合适去 tryAcquire
setHead(node); // acquire 成功,则设置新的头节点
p.next = null; // 将前面节点对当前节点的引用清空
return interrupted;
}
if (shouldParkAfterFailedAcquire(p, node)) // 检查是否失败后需要 park
interrupted |= parkAndCheckInterrupt();
}
} catch (Throwable t) {
cancelAcquire(node);// 出现异常,取消
if (interrupted)
selfInterrupt();
throw t;
}
}
- 循环判断,主要是当本节点成为表头的下一个元素时,去抢占锁,如果成功,则返回结果,停止循环;
- 获取锁不成功,就查看队列是否已满/已取消.需要不需要中断获取锁的线程;
- 捕获异常,判断,如果interrupted为true,中断线程