Giới thiệu
Thuộc tính Stack.IsSynchronized trong C# trả về giá trị boolean cho biết việc truy cập vào Stack 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: Stack chuỗi kiểm tra đồng bộ
using System;
using System.Collections;
public class Demo {
public static void Main() {
Stack stack = new Stack();
stack.Push("Inspiron");
stack.Push("Alienware");
stack.Push("Projectors");
stack.Push("Monitors");
stack.Push("XPS");
stack.Push("Laptop");
stack.Push("Notebook");
Console.WriteLine("Các phần tử Stack...");
foreach(string val in stack) {
Console.WriteLine(val);
}
Console.WriteLine("Số lượng phần tử = " + stack.Count);
Console.WriteLine("Phần tử 'Speakers' có trong stack? = " + stack.Contains("Speakers"));
stack.Push("Headphone");
stack.Push("Keyboard");
stack.Push("Earphone");
Console.WriteLine("\nCác phần tử Stack...đã cập nhật");
foreach(string val in stack) {
Console.WriteLine(val);
}
Console.WriteLine("Số lượng phần tử (đã cập nhật) = " + stack.Count);
Console.WriteLine("\nPhần tử 'Alienware' có trong stack? = " + stack.Contains("Alienware"));
Console.WriteLine("Stack có đồng bộ? = " + stack.IsSynchronized);
Stack stack2 = (Stack)stack.Clone();
Console.WriteLine("\nCác phần tử Stack...đã clone");
IEnumerator demoEnum = stack2.GetEnumerator();
while (demoEnum.MoveNext()) {
Console.WriteLine(demoEnum.Current);
}
Console.WriteLine("Số lượng phần tử (đã cập nhật) = " + stack.Count);
}
}
Đầu ra ví dụ 1
Các phần tử Stack... Notebook Laptop XPS Monitors Projectors Alienware Inspiron Số lượng phần tử = 7 Phần tử 'Speakers' có trong stack? = False Các phần tử Stack...đã cập nhật Earphone Keyboard Headphone Notebook Laptop XPS Monitors Projectors Alienware Inspiron Số lượng phần tử (đã cập nhật) = 10 Phần tử 'Alienware' có trong stack? = True Stack có đồng bộ? = False Các phần tử Stack...đã clone Earphone Keyboard Headphone Notebook Laptop XPS Monitors Projectors Alienware Inspiron Số lượng phần tử (đã cập nhật) = 10
Ví dụ 2: Stack số nguyên với Synchronized wrapper
using System;
using System.Collections;
public class Demo {
public static void Main() {
Stack stack = new Stack();
stack.Push(150);
stack.Push(300);
stack.Push(500);
stack.Push(750);
stack.Push(1000);
stack.Push(1250);
stack.Push(1500);
stack.Push(2000);
stack.Push(2500);
Console.WriteLine("Các phần tử Stack...");
foreach(int val in stack) {
Console.WriteLine(val);
}
Console.WriteLine("Số lượng phần tử = " + stack.Count);
Console.WriteLine("Phần tử 750 có trong stack? = " + stack.Contains(750));
stack.Push(3000);
Console.WriteLine("\nCác phần tử Stack...đã cập nhật");
foreach(int val in stack) {
Console.WriteLine(val);
}
Console.WriteLine("Số lượng phần tử (đã cập nhật) = " + stack.Count);
Console.WriteLine("Phần tử 5000 có trong stack? = " + stack.Contains(5000));
Stack stack2 = (Stack)stack.Clone();
Console.WriteLine("\nCác phần tử Stack...đã clone");
foreach(int val in stack2) {
Console.WriteLine(val);
}
Console.Write("Số lượng phần tử (đã cập nhật) = " + stack2.Count);
Console.WriteLine("Stack có đồng bộ? = " + stack.IsSynchronized);
Stack stack3 = Stack.Synchronized(stack);
Console.WriteLine("Stack3 có đồng bộ? = " + stack3.IsSynchronized);
}
}
Đầu ra ví dụ 2
Các phần tử Stack... 2500 2000 1500 1250 1000 750 500 300 150 Số lượng phần tử = 9 Phần tử 750 có trong stack? = True Các phần tử Stack...đã cập nhật 3000 2500 2000 1500 1250 1000 750 500 300 150 Số lượng phần tử (đã cập nhật) = 10 Phần tử 5000 có trong stack? = False Các phần tử Stack...đã clone 3000 2500 2000 1500 1250 1000 750 500 300 150 Số lượng phần tử (đã cập nhật) = 10 Stack có đồng bộ? = False Stack3 có đồng bộ? = True
Giải thích chi tiết
- Stack mặc định không đồng bộ (
IsSynchronized = false). - Gọi
Stack.Synchronized(stack)trả về wrapper đồng bộ, bọc stack gốc. Wrapper cóIsSynchronized = true. - Wrapper chỉ bảo vệ từng phương thức riêng lẻ. Các thao tác phức tạp (kiểm tra Count rồi Pop) vẫn cần khóa thủ công trên
((ICollection)stack).SyncRoot. - Stack gốc và wrapper chia sẻ dữ liệu. Thay đổi qua wrapper ảnh hưởng stack gốc và ngược lại.
- Trong .NET Core/.NET 5+, khuyến nghị dùng
ConcurrentStack<T>(System.Collections.Concurrent) - lock-free, hiệu năng tốt hơn.
Khi nào cần Stack đồng bộ?
- Nhiều luồng Push/Pop cùng một stack (producer-consumer).
- Ứng dụng server, game server, message processing.
- Thread pool chia sẻ stack công việc.