首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

WCF 併發控制實戰:Mutex、Semaphore、Monitor、Lock 等同步機制比較

     編輯:關於.NET

WCF 服務在 InstanceContextMode.Single + ConcurrencyMode.Multiple 模式下為單一實例多執行緒存取,必須自行處理併發同步。本文比較 .NET 主流同步機制在 WCF 中的應用。

服務架構設定

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
public class Hello : IHello {
    private int _counter;
    private string _result;
    private Mutex _mutex = new Mutex();
    private Semaphore _semaphore = new Semaphore(1, 1);
    private static readonly object _objLock = new object();
    // ...
}

同步機制實作比較

1. 無同步(基準測試)

private void ExecuteNone() {
    CircleCounter(); // 會出現重複計數:1,2,2,3,4,5,5,6...
}

2. Mutex - 跨進程互斥鎖

private void ExecuteMutex() {
    try {
        _mutex.WaitOne();
        CircleCounter();
    } finally {
        _mutex.ReleaseMutex();
    }
}

支援跨進程同步,較重量級,適合命名 Mutex 協調多進程。

3. Semaphore - 訊號量/資源池控制

private void ExecuteSemaphore() {
    try {
        _semaphore.WaitOne(); // 取得一個槽位
        CircleCounter();
    } finally {
        _semaphore.Release(); // 釋放槽位
    }
}

可限制同時存取執行緒數(建構式 new Semaphore(初始, 最大)),適合連線池、資源池控制。

4. Monitor - 底層同步原語

private void ExecuteMonitor() {
    try {
        Monitor.Enter(this);
        CircleCounter();
    } finally {
        Monitor.Exit(this);
    }
}

lock 的編譯器展開形式,支援 TryEnter、Wait/Pulse 進階同步。

5. Lock (C# 關鍵字) - 語法糖

private void ExecuteLock() {
    lock (_objLock) {
        CircleCounter();
    }
}

最常用、可讀性最好,編譯為 Monitor.Enter/Exit + try/finally。

測試方法

客戶端啟動兩個執行緒同時呼叫 Counter(LockType),每執行緒迴圈 10 次,間隔 20ms 模擬併發:

private void CircleCounter() {
    for (int i = 0; i < 10; i++) {
        var counter = _counter;
        Thread.Sleep(20); // 模擬併發窗口
        _counter = ++counter;
        _result += _counter + "|";
    }
}

執行結果分析

同步機制結果說明
None出現重複計數競爭條件,非執行緒安全
Mutex1~20 連續無重複正確同步
Semaphore1~20 連續無重複正確同步
Monitor1~20 連續無重複正確同步
Lock1~20 連續無重複正確同步

其他同步機制補充

  • ThreadPool:執行緒池,佇列工作項目,非直接同步機制
  • Interlocked:原子操作 (Increment, CompareExchange),適用於單一變數更新,效能最佳
  • ReaderWriterLock:讀寫鎖,允許多讀單寫,適合讀多寫少場景

選型建議

場景建議機制
單一進程內簡單互斥lock / Monitor
跨進程同步命名 Mutex
限制並存取數量 (連線池)Semaphore / SemaphoreSlim
高頻率單一變數更新Interlocked
讀多寫少、複雜同步邏輯ReaderWriterLockSlim

WCF 併發控制的核心原則:識別共享狀態 → 選擇適當同步機制 → 縮小臨界區範圍 → 避免死鎖。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved