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

Kiểm tra HybridDictionary có đồng bộ (Synchronized) trong C#

Mục đích

Thuộc tính HybridDictionary.IsSynchronized cho biết instance có **thread-safe** hay không. Mặc định là false. Để có bản thread-safe, dùng wrapper Hashtable.Synchronized (vì HybridDictionary nội bộ dùng Hashtable khi lớn).

Ví dụ 1: Kiểm tra IsSynchronized trên hai Dictionary

using System;
using System.Collections;
using System.Collections.Specialized;

public class Demo
{
    public static void Main()
    {
        HybridDictionary dict1 = new HybridDictionary();
        dict1.Add("A", "Books");
        dict1.Add("B", "Electronics");
        dict1.Add("C", "Smart Wearables");
        dict1.Add("D", "Pet Supplies");
        dict1.Add("E", "Clothing");
        dict1.Add("F", "Footwear");

        Console.WriteLine("Dict1:");
        foreach (DictionaryEntry d in dict1) Console.WriteLine($"{d.Key} {d.Value}");

        Console.WriteLine($"\nIsFixedSize: {dict1.IsFixedSize}");
        Console.WriteLine($"IsReadOnly: {dict1.IsReadOnly}");
        Console.WriteLine($"IsSynchronized: {dict1.IsSynchronized}"); // False

        HybridDictionary dict2 = new HybridDictionary();
        dict2.Add("1", "One"); dict2.Add("2", "Two"); dict2.Add("3", "Three");
        dict2.Add("4", "Four"); dict2.Add("5", "Five"); dict2.Add("6", "Six");

        Console.WriteLine("\nDict2:");
        foreach (DictionaryEntry d in dict2) Console.WriteLine($"{d.Key} {d.Value}");

        Console.WriteLine($"\ndict1 == dict2? {dict1.Equals(dict2)}"); // False
        Console.WriteLine($"IsFixedSize: {dict2.IsFixedSize}");
        Console.WriteLine($"IsReadOnly: {dict2.IsReadOnly}");
        Console.WriteLine($"IsSynchronized: {dict2.IsSynchronized}"); // False
    }
}

Kết quả

Dict1:
A Books
B Electronics
C Smart Wearables
D Pet Supplies
E Clothing
F Footwear

IsFixedSize: False
IsReadOnly: False
IsSynchronized: False

Dict2:
1 One
2 Two
3 Three
4 Four
5 Five
6 Six

dict1 == dict2? False
IsFixedSize: False
IsReadOnly: False
IsSynchronized: False

Ví dụ 2: Tạo bản Synchronized

using System;
using System.Collections;
using System.Collections.Specialized;

public class Demo
{
    public static void Main()
    {
        HybridDictionary dict = new HybridDictionary();
        dict.Add("1", "Finance");
        dict.Add("2", "Marketing");
        dict.Add("3", "IT");
        dict.Add("4", "Operations");
        dict.Add("5", "Purchase");

        Console.WriteLine("HybridDictionary:");
        foreach (DictionaryEntry d in dict) Console.WriteLine($"{d.Key} {d.Value}");

        Console.WriteLine($"\nIsFixedSize: {dict.IsFixedSize}");
        Console.WriteLine($"IsReadOnly: {dict.IsReadOnly}");
        Console.WriteLine($"IsSynchronized: {dict.IsSynchronized}"); // False

        // Tạo wrapper synchronized (thực tế wrap Hashtable nội bộ)
        // Lưu ý: HybridDictionary không có Synchronized() static method riêng.
        // Cách phổ biến: lock thủ công hoặc dùng ConcurrentDictionary.
    }
}

Kết quả

HybridDictionary:
1 Finance
2 Marketing
3 IT
4 Operations
5 Purchase

IsFixedSize: False
IsReadOnly: False
IsSynchronized: False

⚠️ Quan trọng: HybridDictionary KHÔNG có phương thức Synchronized()

Khác với Hashtable.Synchronized() hoặc ArrayList.Synchronized(), HybridDictionary **không cung cấp** wrapper thread-safe sẵn có.

Giải pháp thread-safe

  1. Lock thủ công (đơn giản, hiệu năng thấp khi contention cao):
private readonly object _lock = new();
private readonly HybridDictionary _dict = new HybridDictionary();

public void Add(string key, object value)
{
    lock (_lock) _dict.Add(key, value);
}

public bool Contains(string key)
{
    lock (_lock) return _dict.Contains(key);
}
  1. Dùng ConcurrentDictionary<string, object> (khuyến nghị .NET Core/.NET 5+):
using System.Collections.Concurrent;

var dict = new ConcurrentDictionary();
dict.TryAdd("key", "value");
bool has = dict.ContainsKey("key"); // Thread-safe, lock-free
  1. Immutable Collections (System.Collections.Immutable) cho read-heavy.

Tóm tắt

  • IsSynchronized luôn trả về false trên instance thường.
  • Không có HybridDictionary.Synchronized().
  • **Không dùng HybridDictionary cho code mới**. Dùng Dictionary<TKey, TValue> + lock, hoặc ConcurrentDictionary.