30.1 一個簡單的混合鎖
阿新 • • 發佈:2019-01-05
/// <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(); } }