I could even argue that from a mainenance point of view, it is easier for someone to maintain code if the locking is always happening, rather than the maintainer needing to determine what mode they are in
When you say, "all the while checking if HashMap.containsValue(recordNum)" I assume you mean that after this check, your thread uses wait() to allow the cpu do other things until another thread calls notifyAll(), right? ...
...I tested with unreferenced and it gets called after about fifteen minutes or so
How often will it happen that two clients want to lock the same record at nearly the same time and one of them crashes?