java简单AQS使用

AQS是一种并发数据结构,node

  1. volatile int state
  2. blockingQueue工做队列
  3. lockOwner锁的全部者

以公平锁的acquire为例分析相关代码数据结构

public final void acquire(int i){
	if(!tryAcquired()&&
		acquireQueued(addWaiter(Node.EXCLUSIVE),arg)){
		selfInterrrupt();
	}

}

tryAcquire()-以ReentrantLock的fairTryAcquire(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,中断线程