public void ReleaseLock(object key) { lock (_sync_mutex) { if (_lockTable.Contains(key)) { LockInfo info = _lockTable[key] as LockInfo; if (!info.PulseWaitingThread()) { _lockTable.Remove(key); } } if (_waiting4globalLock && _lockTable.Count == 0) { _globalLock = true; _waiting4globalLock = false; _globalLockInfo.PulseWaitingThread(); } } }