多线程集合锁定类型

时间:2012-07-03 16:47:34

标签: c# .net

我们锁定的方式下面的代码段是否存在差异?

public Hashtable mySet= new Hashtable() //mySet is visible to other threads.
lock (mySet) 
   { 
       mySet.Add("Hello World"); 
   } 

public Hashtable mySet= new Hashtable();
lock(mySet.SyncRoot)
    { 
       mySet.Add("Hello World"); 
    }

3 个答案:

答案 0 :(得分:2)

由于lock的对象passend仅用作“旗帜持有者”,因此不会有任何区别。

see this

答案 1 :(得分:2)

lock实际上并没有锁定有问题的对象,因此使用哪个对象没有区别。相反,它使用该对象来建立协议,并且只要所有线程使用相同的对象,协议就保证只有一个线程将执行该锁保护的代码。

您可以将对象视为脱口秀节目中的麦克风。拿着麦克风的人是唯一允许说话的人(我知道并不总是如何在一些节目中表现出来,但无论如何这都是这个想法)。

答案 2 :(得分:1)

根据MSDN文档here,只有锁定集合的SyncRoot才能保证线程安全。

  

通过集合枚举本质上不是线程安全的   程序。即使集合是同步的,其他线程也可以   仍然修改集合,这会导致枚举器抛出一个   例外。为了在枚举期间保证线程安全,您可以   要么在整个枚举过程中锁定集合,要么抓住它   由其他线程所做的更改导致的异常。