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

多線程入門系列(六):線程同步核心概念與機制

     編輯:關於C#

為何需要同步

多線程共享資源時,若無同步機制,會發生競爭條件:執行結果取決於線程執行順序,導致資料不一致、邏輯錯誤。

同步核心概念

  • 臨界區:存取共享資源的程式碼區段,同一時間只允許一個線程進入。
  • 互斥:確保臨界區互斥執行的機制。
  • 同步原語:實現互斥/同步的基礎工具(鎖、訊號量、事件、屏障等)。
  • 線程安全:類別/方法在多線程環境下正確運作,無需呼叫端額外同步。

.NET 同步機制分層

層級類別/關鍵字特性適用場景
語言級lock語法糖,編譯為 Monitor.Enter/Exit,自動 try/finally簡單互斥,最常用
框架級Monitor提供 TryEnter、Wait/Pulse 等進階功能條件同步、需超時控制
核心物件Mutex跨進程、擁有權、放棄偵測單一實例、跨進程同步
核心物件Semaphore/SemaphoreSlim計數訊號量,控制並發數量資源池、限流
核心物件AutoResetEvent/ManualResetEvent事件訊號,線程間通知工作完成通知、啟動協調
原子操作Interlocked硬體級原子,無鎖計數器、旗標、CAS演算法
高層抽象ReaderWriterLockSlim讀寫分離,多讀單寫讀多寫少的共享資料
高層抽象Barrier/CountdownEvent線程屏障/倒數事件階段性並行協調
現代非同步Task/async/await任務導向,避免阻塞線程I/O 密集、UI 回應、組合非同步

常見同步問題

1. 死鎖

四條件:互斥、佔有並等待、非搶佔、循環等待。預防:固定鎖順序、TryEnter 超時、避免巢狀鎖。

2. 活鎖

線程持續重試卻永無進展(如兩人走廊避讓)。解決:引入隨機延遲、優先級協商。

3. 餓死

低優先級線程長期無法取得資源。解決:公平鎖、優先級反轉保護。

4. 鎖護送

在鎖內呼叫外部代碼/事件,導致死鎖或重入問題。原則:鎖內最小化、不呼叫虛擬方法/委派/事件。

同步最佳實務原則

  1. 縮小鎖範圍:只保護共享資源存取,非共享運算移出鎖外。
  2. 避免巢狀鎖:若必須多鎖,全域固定獲取順序。
  3. 使用專用同步物件:private readonly object sync = new object();,勿鎖 this、typeof(Type)、字串常值。
  4. 優先使用高層抽象:ConcurrentDictionary、BlockingCollection、SemaphoreSlim 等,減少手動同步錯誤。
  5. 非同步優於同步阻塞:I/O 作業用 async/await,釋放線程回執行緒池。
  6. 記憶體可見性:volatile、Interlocked、Thread.MemoryBarrier 確保跨線程可見。

圖示說明

(原文包含三張圖片,展示同步機制分層架構、競爭條件示意、死鎖/活鎖/餓死對比)

同步機制分層架構 競爭條件與臨界區 死鎖活鎖餓死對比
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved