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

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

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.