Giới thiệu
Thuộc tính Queue.IsSynchronized trong C# trả về giá trị boolean cho biết việc truy cập vào Queue có được đồng bộ (thread-safe) hay không. Đây là thuộc tính chỉ đọc (get-only).
Cú pháp
public virtual bool IsSynchronized { get; }
Ví dụ 1: Queue số nguyên
using System;
using System.Collections;
public class Demo {
public static void Main() {
Queue queue = new Queue();
queue.Enqueue(100);
queue.Enqueue(200);
queue.Enqueue(300);
queue.Enqueue(400);
queue.Enqueue(500);
queue.Enqueue(600);
queue.Enqueue(700);
queue.Enqueue(800);
queue.Enqueue(900);
queue.Enqueue(1000);
Console.WriteLine("Queue...");
IEnumerator demoEnum = queue.GetEnumerator();
while (demoEnum.MoveNext()) {
Console.WriteLine(demoEnum.Current);
}
Console.WriteLine("Queue có đồng bộ? = " + queue.IsSynchronized);
}
}
Đầu ra ví dụ 1
Queue... 100 200 300 400 500 600 700 800 900 1000 Queue có đồng bộ? = False
Ví dụ 2: Queue chuỗi với Synchronized wrapper
using System;
using System.Collections;
public class Demo {
public static void Main() {
Queue queue = new Queue();
queue.Enqueue("AB");
queue.Enqueue("BC");
queue.Enqueue("CD");
queue.Enqueue("DE");
queue.Enqueue("EF");
queue.Enqueue("FG");
queue.Enqueue("GH");
queue.Enqueue("HI");
Console.WriteLine("Queue...");
IEnumerator demoEnum = queue.GetEnumerator();
while (demoEnum.MoveNext()) {
Console.WriteLine(demoEnum.Current);
}
Console.WriteLine("Queue có đồng bộ? = " + queue.IsSynchronized);
Queue queue2 = Queue.Synchronized(queue);
Console.WriteLine("Queue bây giờ có đồng bộ? = " + queue2.IsSynchronized);
}
}
Đầu ra ví dụ 2
Queue... AB BC CD DE EF FG GH HI Queue có đồng bộ? = False Queue bây giờ có đồng bộ? = True
Giải thích chi tiết
- Queue mặc định không đồng bộ (
IsSynchronized = false). - Gọi
Queue.Synchronized(queue)trả về một wrapper đồng bộ, bọc queue gốc. Wrapper này cóIsSynchronized = true. - Wrapper đồng bộ chỉ bảo vệ từng phương thức riêng lẻ (Enqueue, Dequeue, Peek...). Nếu cần thao tác phức tạp (kiểm tra Count rồi Dequeue), vẫn phải khóa thủ công trên
((ICollection)queue).SyncRoot. - Trong .NET Core/.NET 5+, khuyến nghị dùng
ConcurrentQueue<T>(System.Collections.Concurrent) cho hiệu năng và API tốt hơn.
Khi nào cần đồng bộ?
- Nhiều luồng producer/consumer chia sẻ cùng một Queue.
- Ứng dụng server xử lý request song song.
Lưu ý hiệu năng
Wrapper đồng bộ dùng khóa (lock) cho mọi phương thức, gây overhead. Với tải cao, ConcurrentQueue dùng lock-free algorithms hiệu quả hơn.