publicvoidacquire() throws InterruptedException {
sync.acquireSharedInterruptibly(1);//获取一个许可}public final voidacquireSharedInterruptibly(int arg)
throws InterruptedException {if(Thread.interrupted())thrownewInterruptedException();if(tryAcquireShared(arg)<0)doAcquireSharedInterruptibly(arg);}protected int tryAcquireShared(int acquires){for(;;){if(hasQueuedPredecessors())return-1;
int available =getState();
int remaining = available - acquires;//现存许可数扣减if(remaining <0||compareAndSetState(available, remaining))return remaining;}}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);if(r >=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){for(;;){//区别在这里,如果有前驱节点,直接获取失败if(hasQueuedPredecessors())return-1;
int available =getState();
int remaining = available - acquires;if(remaining <0||compareAndSetState(available, remaining))return remaining;}}