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
IsSynchronizedluôn trả vềfalsecho mảng chuẩn (không có wrapper synchronized).- Thuộc tính này tồn tại để implement interface
ICollection. SyncRoottrả về đối tượng dùng đểlock(mảng 1 chiều trả về chính nó).- Quan trọng:
IsSynchronized == falsekhô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)ReaderWriterLockSlimcho 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.