📌  相关文章
📜  C#|为哈希表创建同步的(线程安全的)包装器

📅  最后修改于: 2021-05-29 16:39:35             🧑  作者: Mango

Hashtable.Synchronized(Hashtable)方法用于为Hashtable返回一个同步的(线程安全的)包装器。

句法:

该表是要同步的哈希表。

返回值:该方法返回哈希表的同步(线程安全)包装。

异常:如果为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);
    }
}

运行时错误:

笔记:

  • 对于多个读取器和写入器,此方法是线程安全的。此外,同步包装器可确保一次只有一名作家在写作。
  • 通过集合进行枚举本质上不是线程安全的过程。其他线程仍可以修改集合,这即使枚举同步,也会导致枚举器引发异常。
  • 为了保证枚举期间的线程安全,您可以在整个枚举期间锁定集合,也可以捕获由其他线程进行的更改导致的异常。
  • 此方法是O(1)操作。

参考:

  • https://docs.microsoft.com/zh-cn/dotnet/api/system.collections.hashtable.synchronized?view=netframework-4.7.2