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
- 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);
}
- 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
- Immutable Collections (System.Collections.Immutable) cho read-heavy.
Tóm tắt
IsSynchronizedluôn trả vềfalsetrê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ặcConcurrentDictionary.