Giới thiệu
Phương thức Stack.Synchronized() trong C# trả về một wrapper (lớp bao) đồng bộ (thread-safe) cho Stack. Điều này cho phép nhiều luồng truy cập stack an toàn mà không cần khóa thủ công.
Cú pháp
public static System.Collections.Stack Synchronized (System.Collections.Stack stack);
Tham số stack là stack cần đồng bộ hóa.
Ví dụ 1: Stack số nguyên
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...đã sao chép");
foreach(int val in stack2) {
Console.WriteLine(val);
}
Console.Write("Số lượng phần tử (đã cập nhật) = " + stack2.Count);
Console.WriteLine("\nStack có đồng bộ? = " + stack.IsSynchronized);
Stack stack3 = Stack.Synchronized(stack);
Console.WriteLine("Stack3 có đồng bộ? = " + stack3.IsSynchronized);
}
}
Đầu ra ví dụ 1
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...đã sao chép 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
Ví dụ 2: Stack chuỗi
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);
stack.Push("Ultrabook");
stack.Push("Cameras");
stack.Push("Keyboards");
Console.WriteLine("\nCác phần tử Stack...đã cập nhật");
foreach(string val in stack) {
Console.WriteLine(val);
}
Console.WriteLine("\nSố lượng phần tử (đã cập nhật) = " + stack.Count);
Console.WriteLine("Stack có đồng bộ? = " + stack.IsSynchronized);
Stack stack2 = Stack.Synchronized(stack);
Console.WriteLine("Stack2 có đồng bộ? = " + stack2.IsSynchronized);
}
}
Đầu ra ví dụ 2
Các phần tử Stack... Notebook Laptop XPS Monitors Projectors Alienware Inspiron Số lượng phần tử = 7 Các phần tử Stack...đã cập nhật Keyboards Cameras Ultrabook Notebook Laptop XPS Monitors Projectors Alienware Inspiron Số lượng phần tử (đã cập nhật) = 10 Stack có đồng bộ? = False Stack2 có đồng bộ? = True
Lưu ý quan trọng
- Wrapper đồng bộ chỉ bảo vệ các phương thức riêng lẻ (Push, Pop, Peek...). Nếu cần thực hiện nhiều thao tác như một đơn vị nguyên tử (atomic), vẫn phải khóa thủ công trên
((ICollection)stack).SyncRoot. - Stack gốc và wrapper đồng bộ chia sẻ cùng dữ liệu bên dưới.
- Kiểm tra
IsSynchronizedđể biết stack có phải wrapper đồng bộ hay không. - Trong .NET hiện đại, khuyến nghị sử dụng
ConcurrentStack<T>trong namespaceSystem.Collections.Concurrentcho hiệu năng tốt hơn.