В четвертом издании книги Джеффери Рихтера CLR via C# увидел интересный код(возможно он был описан и предшествующих изданиях)
class AnotherHybridLock : IDisposable
{
private Int32 m_waiters = 0;
private AutoResetEvent m_waiterLock = new AutoResetEvent(false);
private Int32 m_spincount = 4000;
private Int32 m_owningThreadId = 0, m_recursion = 0;
public void Enter()
{
Int32 threadId = Thread.CurrentThread.ManagedThreadId;
if (threadId == m_owningThreadId) { m_recursion++; return; }
SpinWait spinwait = new SpinWait();
for (Int32 spinCount = 0; spinCount < m_spincount; spinCount++)
{
if (Interlocked.CompareExchange(ref m_waiters, 1, 0) == 0) goto GotLock;
spinwait.SpinOnce();
}
if (Interlocked.Increment(ref m_waiters) > 1) m_waiterLock.WaitOne();
GotLock:
m_owningThreadId = threadId; m_recursion = 1;
}
public void Leave()
{
Int32 threadId = Thread.CurrentThread.ManagedThreadId;
if (threadId != m_owningThreadId) throw new SynchronizationLockException("Lock not owned by calling thread");
if (--m_recursion > 0) return;
m_owningThreadId = 0;
if (Interlocked.Decrement(ref m_waiters) == 0) return;
m_waiterLock.Set();
}
public void Dispose()
{
m_waiterLock.Dispose();
}
}
За
goto руки отрывают, но Рихтер все-таки авторитет.

Придется оставить жить