code: public TRow getRowOrLock(long id) {
  
  		TRow row = null;
  
  		lock.lock();
  		try {
  			RowCondition rowCondition = rows.get(id);
  			if (rowCondition != null) {
  				row = rowCondition.row;
  				if (row == null) {
  					// Another thread is currently retrieving the row, wait
  					rowCondition.condition.await();
  
  					// Row has now been retrieved
  					row = rowCondition.row;
  				}
  			} else {
  				// Set the row condition and the calling thread is now
  				// responsible for retrieving the row
  				rowCondition = new RowCondition();
  				rowCondition.condition = lock.newCondition();
  				rows.put(id, rowCondition);
  			}
  		} catch (InterruptedException e) {
  			throw new GeoPackageException(
  					"Interruption obtaining cached row or row lock. id: " + id,
  					e);
  		} finally {
  			lock.unlock();
  		}
  
  		return row;
  	}
docs: Get the row if another same id request has been made by waiting until the
  row has been set. If no current request, lock the for the calling thread
  which should read the row and call {@link #setRow(long, UserCoreRow)}
  when complete.
  
  @param id
  user row id
  @return row if retrieved from a previous request, null if calling thread
  should read row and set using {@link #setRow(long, UserCoreRow)}