private long acquireRead(boolean interruptible,long deadline){
  WNode node=null, p;
  for (int spins=-1; ; ) {
    WNode h;
    if ((h=whead) == (p=wtail)) {
      for (long m, s, ns; ; ) {
        if ((m=(s=state) & ABITS) < RFULL ? U.compareAndSwapLong(this,STATE,s,ns=s + RUNIT) : (m < WBIT && (ns=tryIncReaderOverflow(s)) != 0L))         return ns;
 else         if (m >= WBIT) {
          if (spins > 0) {
            if (LockSupport.nextSecondarySeed() >= 0)             --spins;
          }
 else {
            if (spins == 0) {
              WNode nh=whead, np=wtail;
              if ((nh == h && np == p) || (h=nh) != (p=np))               break;
            }
            spins=SPINS;
          }
        }
      }
    }
    if (p == null) {
      WNode hd=new WNode(WMODE,null);
      if (U.compareAndSwapObject(this,WHEAD,null,hd))       wtail=hd;
    }
 else     if (node == null)     node=new WNode(RMODE,p);
 else     if (h == p || p.mode != RMODE) {
      if (node.prev != p)       node.prev=p;
 else       if (U.compareAndSwapObject(this,WTAIL,p,node)) {
        p.next=node;
        break;
      }
    }
 else     if (!U.compareAndSwapObject(p,WCOWAIT,node.cowait=p.cowait,node))     node.cowait=null;
 else {
      for (; ; ) {
        WNode pp, c;
        Thread w;
        if ((h=whead) != null && (c=h.cowait) != null && U.compareAndSwapObject(h,WCOWAIT,c,c.cowait) && (w=c.thread) != null)         U.unpark(w);
        if (h == (pp=p.prev) || h == p || pp == null) {
          long m, s, ns;
          do {
            if ((m=(s=state) & ABITS) < RFULL ? U.compareAndSwapLong(this,STATE,s,ns=s + RUNIT) : (m < WBIT && (ns=tryIncReaderOverflow(s)) != 0L))             return ns;
          }
 while (m < WBIT);
        }
        if (whead == h && p.prev == pp) {
          long time;
          if (pp == null || h == p || p.status > 0) {
            node=null;
            break;
          }
          if (deadline == 0L)           time=0L;
 else           if ((time=deadline - System.nanoTime()) <= 0L)           return cancelWaiter(node,p,false);
          Thread wt=Thread.currentThread();
          U.putObject(wt,PARKBLOCKER,this);
          node.thread=wt;
          if ((h != pp || (state & ABITS) == WBIT) && whead == h && p.prev == pp)           U.park(false,time);
          node.thread=null;
          U.putObject(wt,PARKBLOCKER,null);
          if (interruptible && Thread.interrupted())           return cancelWaiter(node,p,true);
        }
      }
    }
  }
  for (int spins=-1; ; ) {
    WNode h, np, pp;
    int ps;
    if ((h=whead) == p) {
      if (spins < 0)       spins=HEAD_SPINS;
 else       if (spins < MAX_HEAD_SPINS)       spins<<=1;
      for (int k=spins; ; ) {
        long m, s, ns;
        if ((m=(s=state) & ABITS) < RFULL ? U.compareAndSwapLong(this,STATE,s,ns=s + RUNIT) : (m < WBIT && (ns=tryIncReaderOverflow(s)) != 0L)) {
          WNode c;
          Thread w;
          whead=node;
          node.prev=null;
          while ((c=node.cowait) != null) {
            if (U.compareAndSwapObject(node,WCOWAIT,c,c.cowait) && (w=c.thread) != null)             U.unpark(w);
          }
          return ns;
        }
 else         if (m >= WBIT && LockSupport.nextSecondarySeed() >= 0 && --k <= 0)         break;
      }
    }
 else     if (h != null) {
      WNode c;
      Thread w;
      while ((c=h.cowait) != null) {
        if (U.compareAndSwapObject(h,WCOWAIT,c,c.cowait) && (w=c.thread) != null)         U.unpark(w);
      }
    }
    if (whead == h) {
      if ((np=node.prev) != p) {
        if (np != null)         (p=np).next=node;
      }
 else       if ((ps=p.status) == 0)       U.compareAndSwapInt(p,WSTATUS,0,WAITING);
 else       if (ps == CANCELLED) {
        if ((pp=p.prev) != null) {
          node.prev=pp;
          pp.next=node;
        }
      }
 else {
        long time;
        if (deadline == 0L)         time=0L;
 else         if ((time=deadline - System.nanoTime()) <= 0L)         return cancelWaiter(node,node,false);
        Thread wt=Thread.currentThread();
        U.putObject(wt,PARKBLOCKER,this);
        node.thread=wt;
        if (p.status < 0 && (p != h || (state & ABITS) == WBIT) && whead == h && node.prev == p)         U.park(false,time);
        node.thread=null;
        U.putObject(wt,PARKBLOCKER,null);
        if (interruptible && Thread.interrupted())         return cancelWaiter(node,node,true);
      }
    }
  }
}

private long acquireRead ( boolean interruptible , long deadline ) { WNode node = null , p ; for ( int spins = - 1 ; ; ) { WNode h ; if ( ( h = whead ) == ( p = wtail ) ) { for ( long m , s , ns ; ; ) { if ( ( m = ( s = state ) & ABITS ) < RFULL ? U . compareAndSwapLong ( this , STATE , s , ns = s + RUNIT ) : ( m < WBIT && ( ns = tryIncReaderOverflow ( s ) ) != 0L ) ) return ns ; else if ( m >= WBIT ) { if ( spins > 0 ) { if ( LockSupport . nextSecondarySeed ( ) >= 0 ) -- spins ; } else { if ( spins == 0 ) { WNode nh = whead , np = wtail ; if ( ( nh == h && np == p ) || ( h = nh ) != ( p = np ) ) break ; } spins = SPINS ; } } } } if ( p == null ) { WNode hd = new WNode ( WMODE , null ) ; if ( U . compareAndSwapObject ( this , WHEAD , null , hd ) ) wtail = hd ; } else if ( node == null ) node = new WNode ( RMODE , p ) ; else if ( h == p || p . mode != RMODE ) { if ( node . prev != p ) node . prev = p ; else if ( U . compareAndSwapObject ( this , WTAIL , p , node ) ) { p . next = node ; break ; } } else if ( ! U . compareAndSwapObject ( p , WCOWAIT , node . cowait = p . cowait , node ) ) node . cowait = null ; else { for ( ; ; ) { WNode pp , c ; Thread w ; if ( ( h = whead ) != null && ( c = h . cowait ) != null && U . compareAndSwapObject ( h , WCOWAIT , c , c . cowait ) && ( w = c . thread ) != null ) U . unpark ( w ) ; if ( h == ( pp = p . prev ) || h == p || pp == null ) { long m , s , ns ; do { if ( ( m = ( s = state ) & ABITS ) < RFULL ? U . compareAndSwapLong ( this , STATE , s , ns = s + RUNIT ) : ( m < WBIT && ( ns = tryIncReaderOverflow ( s ) ) != 0L ) ) return ns ; } while ( m < WBIT ) ; } if ( whead == h && p . prev == pp ) { long time ; if ( pp == null || h == p || p . status > 0 ) { node = null ; break ; } if ( deadline == 0L ) time = 0L ; else if ( ( time = deadline - System . nanoTime ( ) ) <= 0L ) return cancelWaiter ( node , p , false ) ; Thread wt = Thread . currentThread ( ) ; U . putObject ( wt , PARKBLOCKER , this ) ; node . thread = wt ; if ( ( h != pp || ( state & ABITS ) == WBIT ) && whead == h && p . prev == pp ) U . park ( false , time ) ; node . thread = null ; U . putObject ( wt , PARKBLOCKER , null ) ; if ( interruptible && Thread . interrupted ( ) ) return cancelWaiter ( node , p , true ) ; } } } } for ( int spins = - 1 ; ; ) { WNode h , np , pp ; int ps ; if ( ( h = whead ) == p ) { if ( spins < 0 ) spins = HEAD_SPINS ; else if ( spins < MAX_HEAD_SPINS ) spins <<= 1 ; for ( int k = spins ; ; ) { long m , s , ns ; if ( ( m = ( s = state ) & ABITS ) < RFULL ? U . compareAndSwapLong ( this , STATE , s , ns = s + RUNIT ) : ( m < WBIT && ( ns = tryIncReaderOverflow ( s ) ) != 0L ) ) { WNode c ; Thread w ; whead = node ; node . prev = null ; while ( ( c = node . cowait ) != null ) { if ( U . compareAndSwapObject ( node , WCOWAIT , c , c . cowait ) && ( w = c . thread ) != null ) U . unpark ( w ) ; } return ns ; } else if ( m >= WBIT && LockSupport . nextSecondarySeed ( ) >= 0 && -- k <= 0 ) break ; } } else if ( h != null ) { WNode c ; Thread w ; while ( ( c = h . cowait ) != null ) { if ( U . compareAndSwapObject ( h , WCOWAIT , c , c . cowait ) && ( w = c . thread ) != null ) U . unpark ( w ) ; } } if ( whead == h ) { if ( ( np = node . prev ) != p ) { if ( np != null ) ( p = np ) . next = node ; } else if ( ( ps = p . status ) == 0 ) U . compareAndSwapInt ( p , WSTATUS , 0 , WAITING ) ; else if ( ps == CANCELLED ) { if ( ( pp = p . prev ) != null ) { node . prev = pp ; pp . next = node ; } } else { long time ; if ( deadline == 0L ) time = 0L ; else if ( ( time = deadline - System . nanoTime ( ) ) <= 0L ) return cancelWaiter ( node , node , false ) ; Thread wt = Thread . currentThread ( ) ; U . putObject ( wt , PARKBLOCKER , this ) ; node . thread = wt ; if ( p . status < 0 && ( p != h || ( state & ABITS ) == WBIT ) && whead == h && node . prev == p ) U . park ( false , time ) ; node . thread = null ; U . putObject ( wt , PARKBLOCKER , null ) ; if ( interruptible && Thread . interrupted ( ) ) return cancelWaiter ( node , node , true ) ; } } } }
see above for explanation .
