2

下面的代码段在我们锁定的方式上有区别吗?

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"); 
    }
4

3 回答 3

2

由于传递给的对象lock将仅用作“标志持有人”,这不会有任何区别。

请看这个

于 2012-07-03T16:49:45.537 回答
2

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

您可以将对象想象为脱口秀节目中的麦克风。谁拿着麦克风是唯一被允许说话的人(我知道在某些节目中并不总是这样,但无论如何这就是想法)。

于 2012-07-03T16:54:12.413 回答
1

根据此处的 MSDN 文档,只有在集合的 SyncRoot 上的锁才能保证线程安全。

通过集合进行枚举本质上不是线程安全的过程。即使一个集合被同步,其他线程仍然可以修改该集合,这会导致枚举器抛出异常。为了保证枚举过程中的线程安全,您可以在整个枚举过程中锁定集合,也可以捕获其他线程更改导致的异常。

于 2012-07-03T16:58:47.090 回答