我们锁定的方式下面的代码段是否存在差异?
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");
}
答案 0 :(得分:2)
由于lock
的对象passend仅用作“旗帜持有者”,因此不会有任何区别。
答案 1 :(得分:2)
lock
实际上并没有锁定有问题的对象,因此使用哪个对象没有区别。相反,它使用该对象来建立协议,并且只要所有线程使用相同的对象,协议就保证只有一个线程将执行该锁保护的代码。
您可以将对象视为脱口秀节目中的麦克风。拿着麦克风的人是唯一允许说话的人(我知道并不总是如何在一些节目中表现出来,但无论如何这都是这个想法)。
答案 2 :(得分:1)
根据MSDN文档here,只有锁定集合的SyncRoot才能保证线程安全。
通过集合枚举本质上不是线程安全的 程序。即使集合是同步的,其他线程也可以 仍然修改集合,这会导致枚举器抛出一个 例外。为了在枚举期间保证线程安全,您可以 要么在整个枚举过程中锁定集合,要么抓住它 由其他线程所做的更改导致的异常。