// returns the most recent val Object lock(Ref ref) { // can't upgrade readLock, so release it releaseIfEnsured(ref); boolean unlocked = true; try { tryWriteLock(ref); unlocked = false; if (ref.tvals != null && ref.tvals.point > readPoint) throw retryex; Info refinfo = ref.tinfo; // write lock conflict if (refinfo != null && refinfo != info && refinfo.running()) { if (!barge(refinfo)) { ref.lock.writeLock().unlock(); unlocked = true; return blockAndBail(refinfo); } } ref.tinfo = info; return ref.tvals == null ? null : ref.tvals.val; } finally { if (!unlocked) ref.lock.writeLock().unlock(); } }