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

Phương thức Stack.Synchronized() trong C#

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 namespace System.Collections.Concurrent cho hiệu năng tốt hơn.