code: public boolean acquireReadLock(long timeout) throws InterruptedException {
          LockInfo info = (LockInfo)mLockInfoRef.get();
  
          if (info.mType == NONE) {
              synchronized (this) {
                  if (!readLockAvailable()) {
                      if (timeout < 0) {
                          while (true) {
                              wait();
                              if (readLockAvailable()) {
                                  break;
                              }
                          }
                      }
                      else if (timeout > 0) {
                          long expire = System.currentTimeMillis() + timeout;
                          while (true) {
                              wait(timeout);
                              if (readLockAvailable()) {
                                  break;
                              }
                              timeout = expire - System.currentTimeMillis();
                              if (timeout <= 0) {
                                  return false;
                              }
                          };
                      }
                      else {
                          return false;
                      }
                  }
                  mReadLocks++;
              }
              info.mType = READ;
          }     
          
          info.mCount++;
          return true;
      }
docs: A read lock is obtained when no threads currently hold a write lock.
  When a thread has a read lock, it only blocks threads that wish to
  acquire a write lock.
  <p>
  A read lock is the weakest form of lock.
  
  @param timeout milliseconds to wait for lock acquisition. If negative,
  timeout is infinite.
  @return true if the lock was acquired.