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

C# 多線程同步實戰:兩線程協同清空 ArrayList

     編輯:關於C#

多線程環境下對共享資源的安全訪問是並發編程的核心課題。本文通過一個「兩線程輪流從 ArrayList 刪除元素直到清空」的完整範例,演示 Monitor 鎖機制與事件通知的協同應用。

核心邏輯

  • 共享資源:ArrayList stringList,初始填充 1000 個隨機字符串。
  • 同步原語:Monitor.Enter(this) / Monitor.Exit(this) 實現互斥訪問。
  • 完成通知:自定義事件 OnNumberClear,當列表為空時觸發。
  • 線程終止:事件處理器中調用 Thread.Abort() 強制結束兩線程(註:現代開發建議使用 CancellationToken 替代)。

關鍵代碼片段

private void Run()
{
    while (true)
    {
        Monitor.Enter(this);
        string val = (string)stringList[0];
        Console.WriteLine($"{Thread.CurrentThread.Name} 刪除了 {val}");
        stringList.RemoveAt(0);
        if (stringList.Count == 0)
            OnNumberClear?.Invoke(this, EventArgs.Empty);
        Monitor.Exit(this);
        Thread.Sleep(5);
    }
}

void ThreadDemo_OnNumberClear(object sender, EventArgs e)
{
    Console.WriteLine("執行完畢,停止所有線程。");
    threadTwo.Abort();
    threadOne.Abort();
}

同步機制對比

除 Monitor 外,C# 還提供 lock(語法糖)、Mutex(跨進程)、Semaphore(信號量)、ReaderWriterLockSlim(讀寫分離)等同步工具,應根據場景選型。

現代改進建議

  1. 使用 ConcurrentQueue<T> 替代 ArrayList + 鎖,無鎖線程安全。
  2. 採用 CancellationTokenSource 實現優雅取消,避免 Thread.Abort() 導致的狀態損壞。
  3. 考慮 Parallel.ForEach 或 Task.Run 簡化並發代碼。

運行效果

執行截圖

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