public override void Lock() { Thread caller = Thread.CurrentThread; lock (this) { if(GetHold(caller)) return; } WaitNode n = new WaitNode(); n.DoWaitUninterruptibly(this); }