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

Thuộc tính Array.IsSynchronized trong C#

Thuộc tính Array.IsSynchronized trả về bool cho biết mảng có được đồng bộ hóa (thread-safe) hay không. Trong .NET, mảng mặc định KHÔNG synchronized (trả về false).

Cú pháp

public bool IsSynchronized { get; }

Ví dụ minh họa

using System;
using System.Collections;

class Program
{
    static void Main()
    {
        Array arr = new int[] { 2, 1, 9, 4, 8, 6, 8 };
        
        Console.WriteLine($"IsSynchronized: {arr.IsSynchronized}"); // False
        Console.WriteLine($"SyncRoot type: {arr.SyncRoot.GetType().Name}"); // Int32[] (mảng 1 chiều)
        
        // Để thread-safe, phải lock thủ công trên SyncRoot
        lock (arr.SyncRoot)
        {
            foreach (object val in arr)
                Console.Write(val + " ");
        }
    }
}

Kết quả

IsSynchronized: False
SyncRoot type: Int32[]
2 1 9 4 8 6 8

Giải thích

  • IsSynchronized luôn trả về false cho mảng chuẩn (không có wrapper synchronized).
  • Thuộc tính này tồn tại để implement interface ICollection.
  • SyncRoot trả về đối tượng dùng để lock (mảng 1 chiều trả về chính nó).
  • Quan trọng: IsSynchronized == false không có nghĩa là "không thể đồng bộ", mà là "không tự động đồng bộ". Bạn phải tự lock(SyncRoot).

Lưu ý thực tế

  • Mảng hiếm khi dùng trong đa luồng trực tiếp. Thay vào đó dùng:
  • List<T> + lock (cho read-heavy)
  • ConcurrentBag<T>, ConcurrentQueue<T>, ConcurrentDictionary<TKey,TValue> (lock-free, high performance)
  • ImmutableArray<T> (thread-safe by design, functional style)
  • ReaderWriterLockSlim cho read-heavy/write-rare.

Kết luận: Array.IsSynchronized hầu như luôn false. Đừng dựa vào nó. Luôn tự quản lý đồng bộ hóa với lock hoặc dùng concurrent collections.