code: private AtomicVector getRow(int row, int col, boolean createIfAbsent) {
          rowReadLock.lock();
          AtomicVector rowEntry = sparseMatrix.get(row);
          rowReadLock.unlock();
           
          // If no row existed, create one
          if (rowEntry == null && createIfAbsent) {
              rowWriteLock.lock();
              // ensure that another thread has not already added this row while
              // this thread was waiting on the lock
              rowEntry = sparseMatrix.get(row);
              if (rowEntry == null) {
                  rowEntry = new AtomicVector(new CompactSparseVector());
  
                  // update the bounds as necessary
                  if (row >= rows.get()) {
                      rows.set(row + 1);
                  }
                  if (col >= cols.get()) {
                      cols.set(col + 1);
                  }
                  sparseMatrix.put(row, rowEntry);
              }
              rowWriteLock.unlock();
          }
          return rowEntry;
      }
docs: Gets the {@code AtomicVector} associated with the index, or {@code null}
  if no row entry is present, or if {@code createIfAbsent} is {@code true},
  creates the missing row and returns that.
  
  @param row the row to get
  @param col the column in the row that will be accessed or {@code -1} if
  the entire row is needed.  This value is only used to resize the
  matrix dimensions if the row is to be created.
  @param createIfAbsent {@true} if a row that is requested but not present
  should be created
  
  @return the row at the entry or {@code null} if the row is not present
  and it was not to be created if absent