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

Tương đương CopyOnWriteArrayList trong C#

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áchThread-safePerformance đọcPerformance ghiGhi chú
ImmutableList✓ (bất biến)Rất tốtTạo mới O(n)Functional style, GC pressure
SynchronizedCollection✓ (lock)Trung bìnhTrung bìnhLock toàn bộ, legacy
ConcurrentBag✓ (lock-free)TốtTốtKhông giữ thứ tự, cho phép duplicate
lock + List✓Tùy lockTùy lockKiểm soát đầy đủ

Khuyến nghị: ImmutableList cho read-heavy, ConcurrentBag cho unordered, lock+List cho controllo đầy đủ.