1. 程式人生 > >30.1 一個簡單的混合鎖

30.1 一個簡單的混合鎖

 

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