Ugh.  We shouldn't rely on GC to release locks.  If a caller leaks a lock and doesn't release it, the lock probably should stay held indefinitely.  The caller might not have fully cleaned up after themselves, another access to the same resource could find it in an inconsistent state.  Its also easier to identify a caller who didn't clean up if the entire system grinds to a halt because the lock is still valid and nobody can get it anymore.  If the system sometimes suddenly frees up because a GC ran and finalization ran, then its a lot harder to identify a problem.