* @return the row at the entry or {@code null} if the row is not present
* and it was not to be created if absent
*/
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);
}