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

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

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.
  • Hệ thống real-time, game server, message queue.

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.