AQS是一种并发数据结构,node
以公平锁的acquire为例分析相关代码数据结构
public final void acquire(int i){ if(!tryAcquired()&& acquireQueued(addWaiter(Node.EXCLUSIVE),arg)){ selfInterrrupt(); } }
获取当前state if(state==0){ 无人占用,则经过cas改变state状态, 成功后,从新设置锁的全部者; return true; }else{ if(当前线程=锁的全部者){ state+=1;设置state; return true; } return false; }
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; } }