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