Hashtable.Synchronized(Hashtable)方法用于为Hashtable返回一个同步的(线程安全的)包装器。
句法:
public static System.Collections.Hashtable Synchronized (System.Collections.Hashtable table);
该表是要同步的哈希表。
返回值:该方法返回哈希表的同步(线程安全)包装。
异常:如果表为null,则此方法将引发ArgumentNullException。
下面的程序说明了上面讨论的方法的使用:
范例1:
// C# code to get a synchronized (thread-
// safe) wrapper for the Hashtable
using System;
using System.Collections;
class GFG {
// Main method
static void Main(string[] args)
{
// create and initalize Hash table
// using Add() method
Hashtable has1 = new Hashtable();
has1.Add("1", "Welcome");
has1.Add("2", "to");
has1.Add("3", "geeks");
has1.Add("4", "for");
has1.Add("5", "geeks");
// Creating a synchronized packing
// around the Hashtable
Hashtable has2 = Hashtable.Synchronized(has1);
// --------- Using IsSynchronized Property
// print the status of both Hashtables
Console.WriteLine("has1 Hashtable is {0}.",
has1.IsSynchronized ? "synchronized" :
"not synchronized");
Console.WriteLine("has2 Hashtable is {0}.",
has2.IsSynchronized ? "synchronized" :
"not synchronized");
}
}
输出:
has1 Hashtable is not synchronized.
has2 Hashtable is synchronized.
范例2:
// C# code to get a synchronized (thread-
// safe) wrapper for the Hashtable
using System;
using System.Collections;
class GFG {
// Main method
static void Main(string[] args)
{
// create and initalize Hash table
// there will be no elements
Hashtable has1 = new Hashtable();
// it will give runtime error as
// table parameter can't be null
Hashtable has2 = Hashtable.Synchronized(null);
}
}
运行时错误:
Unhandled Exception:
System.ArgumentNullException: Value cannot be null.
Parameter name: table
笔记:
- 对于多个读取器和写入器,此方法是线程安全的。此外,同步包装器可确保一次只有一名作家在写作。
- 通过集合进行枚举本质上不是线程安全的过程。其他线程仍可以修改集合,这即使枚举同步,也会导致枚举器引发异常。
- 为了保证枚举期间的线程安全,您可以在整个枚举期间锁定集合,也可以捕获由其他线程进行的更改导致的异常。
- 此方法是O(1)操作。
参考:
- https://docs.microsoft.com/zh-cn/dotnet/api/system.collections.hashtable.synchronized?view=netframework-4.7.2