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();
         }
     }
 }