/// <summary> /// 简单混合锁 /// </summary> internal sealed class SimpleHybridLock : IDisposable { //由基元用户模式构造(Interlocked的方法)使用 private int _waiters = 0; //AutoResetEvent 是基元内核模式构造 private AutoResetEvent _waiterLock = new AutoResetEvent(false); public void Enter() { //指出这个线程想要获得锁 if (Interlocked.Increment(ref _waiters) == 1) return; //锁可自由使用,无竞争,直接返回 //另一个线程拥有锁(发生竞争),使这个线程等待 _waiterLock.WaitOne(); //这里产生较大的性能影响 //WaitOne返回后,这个线程拿到锁了 } public void Leave() { //这个线程准备释放锁 if (Interlocked.Decrement(ref _waiters) == 0) return; //没有其他线程正在等待,直接返回 //有其他线程正在阻塞,唤醒其中一个 _waiterLock.Set(); //这里产生较大的性能影响 } public void Dispose() { _waiterLock.Dispose(); } }