Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C#

Đồng bộ hóa (Synchronization) ArrayList trong C#

ArrayList không thread-safe. Dùng ArrayList.Synchronized tạo wrapper synchronized.

Lock thủ công với SyncRoot

ArrayList arr = new ArrayList();
lock (arr.SyncRoot)
{
    foreach (object ele in arr) { ... }
}

Wrapper Synchronized

ArrayList arr1 = new ArrayList();
arr1.Add("One"); ... arr1.Add("Eight");

ArrayList arr2 = ArrayList.Synchronized(arr1);

Console.WriteLine("arr1: {0}", arr1.IsSynchronized ? "sync" : "not sync");
Console.WriteLine("arr2: {0}", arr2.IsSynchronized ? "sync" : "not sync");

Kết quả

arr1: not sync
arr2: sync

Lưu ý quan trọng:

  • Wrapper chỉ sync từng operation đơn lẻ. Enum (foreach) cần lock thủ công
  • List<T> không có Synchronized - tự lock hoặc dùng ConcurrentBag, ConcurrentQueue
  • Khuyến nghị: Dùng System.Collections.Concurrent (ConcurrentDictionary, ConcurrentQueue, BlockingCollection) cho multi-thread
  • ImmutableList cho read-heavy scenarios