.net线程安全

时间:2010-04-02 13:23:17

标签: .net thread-safety

为什么锁定一种被认为非常糟糕的类型? 例如,lock(typeof(DateTime))我理解.net中任何类的静态方法都被认为是线程安全的,而实例成员则不是。因此,在使用DateTime时无需锁定它。我正在阅读的这本书没有解释为什么它只是说它是坏的。任何解释都会很棒。

3 个答案:

答案 0 :(得分:9)

CLR为每个AppDomain维护每个类型的单个实例(正如Joe在他的回答中指出的那样,有时甚至可以在更广泛的上下文中共享它们。)

由于您无法控制对类型的访问,因此您可能会发现自己无意中阻止或被完全不相关的代码阻止,这些代码也会锁定您的类型。

相反,您通常应该锁定与要锁定的操作(或相关操作)位于同一类中的私有实例,以便您可以控制锁定影响和阻止的内容。 (虽然也有一些情况下锁定一些众所周知的同步对象是有意义的,这些对象旨在跨不同的对象使用。)

答案 1 :(得分:2)

来自MSDN

  

lock关键字通过获取给定对象的互斥锁,执行语句,然后释放锁来将语句块标记为关键部分。该声明采用以下形式:

所以基本上你应该锁定一个对象。因此,如果您想拥有锁,则应该拥有一个锁定的特定对象,例如HashTable或专门用于锁定的共享object等容器。

通过锁定typeof(DateTime)的结果,您说没有其他对象可以锁定该类型。这是一个过于粗糙的锁 - 换句话说,你的代码能够锁定代码中其他地方的另一个DateTime对象,但你的方法不会是可能的。

答案 2 :(得分:1)

除了已经提到的原因之外,可以在同一进程中的不同AppDomain之间共享Type对象。因此,在不同的AppDomain中运行的代码可能会使您的应用程序陷入僵局。

对此here进行了一些讨论。