多線程環境下對共享資源的安全訪問是並發編程的核心課題。本文通過一個「兩線程輪流從 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(讀寫分離)等同步工具,應根據場景選型。
ConcurrentQueue<T> 替代 ArrayList + 鎖,無鎖線程安全。CancellationTokenSource 實現優雅取消,避免 Thread.Abort() 導致的狀態損壞。Parallel.ForEach 或 Task.Run 簡化並發代碼。