Java CopyOnWriteArrayList - thread-safe list copy-on-write. C# không có bản tương đương trực tiếp. Dùng ImmutableList<T> (System.Collections.Immutable) hoặc khóa thủ công.
Giải pháp C#
1. ImmutableList (khuyên dùng .NET Core/.NET 5+)
using System.Collections.Immutable; var list = ImmutableList.Create("A", "B", "C"); // Thêm → trả về list MỚI, list cũ không đổi var newList = list.Add("D"); // list vẫn là ["A","B","C"], newList là ["A","B","C","D"]
2. SynchronizedCollection (WCF, legacy)
using System.Collections.Generic; using System.ServiceModel; // Cần reference System.ServiceModel var syncList = new SynchronizedCollection(); syncList.Add("A"); // Thread-safe // Nhưng performance kém do lock toàn bộ collection
3. ReaderWriterLockSlim + List (tự quản lý)
using System.Collections.Generic; using System.Threading; class ThreadSafeList{ private readonly List _list = new List (); private readonly ReaderWriterLockSlim _lock = new ReaderWriterLockSlim(); public void Add(T item) { _lock.EnterWriteLock(); try { _list.Add(item); } finally { _lock.ExitWriteLock(); } } public List ToList() { _lock.EnterReadLock(); try { return new List (_list); } // Copy để trả về finally { _lock.ExitReadLock(); } } }
So sánh
| Cách | Thread-safe | Performance đọc | Performance ghi | Ghi chú |
|---|---|---|---|---|
| ImmutableList | ✓ (bất biến) | Rất tốt | Tạo mới O(n) | Functional style, GC pressure |
| SynchronizedCollection | ✓ (lock) | Trung bình | Trung bình | Lock toàn bộ, legacy |
| ConcurrentBag | ✓ (lock-free) | Tốt | Tốt | Không giữ thứ tự, cho phép duplicate |
| lock + List | ✓ | Tùy lock | Tùy lock | Kiểm soát đầy đủ |
Khuyến nghị: ImmutableList cho read-heavy, ConcurrentBag cho unordered, lock+List cho controllo đầy đủ.