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ùngConcurrentBag,ConcurrentQueue- Khuyến nghị: Dùng
System.Collections.Concurrent(ConcurrentDictionary, ConcurrentQueue, BlockingCollection) cho multi-thread ImmutableListcho read-heavy scenarios