publicvoidawait() throws InterruptedException {
sync.acquireSharedInterruptibly(1);}public final voidacquireSharedInterruptibly(int arg)
throws InterruptedException {if(Thread.interrupted())thrownewInterruptedException();if(tryAcquireShared(arg)<0)doAcquireSharedInterruptibly(arg);}privatevoiddoAcquireSharedInterruptibly(int arg)
throws InterruptedException {
final Node node =addWaiter(Node.SHARED);
boolean failed =true;try{for(;;){
final Node p = node.predecessor();if(p == head){
int r =tryAcquireShared(arg);//状态是否已经归0if(r >=0){//状态已经归0,所有被挂起的任务可以唤醒了setHeadAndPropagate(node, r);//有界阻塞队列里的等待线程全部唤醒
p.next =null;// help GC
failed =false;return;}}if(shouldParkAfterFailedAcquire(p, node)&&parkAndCheckInterrupt())//挂起线程,并返回线程是否中断thrownewInterruptedException();}}finally{if(failed)cancelAcquire(node);}}protected int tryAcquireShared(int acquires){return(getState()==0)?1:-1;}private final boolean parkAndCheckInterrupt(){
LockSupport.park(this);return Thread.interrupted();}
任务完成时释放状态
publicvoidcountDown(){
sync.releaseShared(1);}protected boolean tryReleaseShared(int releases){// Decrement count; signal when transition to zerofor(;;){
int c =getState();if(c ==0)returnfalse;
int nextc = c-1;if(compareAndSetState(c, nextc))return nextc ==0;}}
查看等待完成的任务数
public long getCount() {
return sync.getCount();
}
int getCount() {
return getState();
}