为什么锁定一种被认为非常糟糕的类型?
例如,lock(typeof(DateTime))
我理解.net中任何类的静态方法都被认为是线程安全的,而实例成员则不是。因此,在使用DateTime时无需锁定它。我正在阅读的这本书没有解释为什么它只是说它是坏的。任何解释都会很棒。
答案 0 :(得分:9)
CLR为每个AppDomain维护每个类型的单个实例(正如Joe在他的回答中指出的那样,有时甚至可以在更广泛的上下文中共享它们。)
由于您无法控制对类型的访问,因此您可能会发现自己无意中阻止或被完全不相关的代码阻止,这些代码也会锁定您的类型。
相反,您通常应该锁定与要锁定的操作(或相关操作)位于同一类中的私有实例,以便您可以控制锁定影响和阻止的内容。 (虽然也有一些情况下锁定一些众所周知的同步对象是有意义的,这些对象旨在跨不同的对象使用。)
答案 1 :(得分:2)
来自MSDN:
lock关键字通过获取给定对象的互斥锁,执行语句,然后释放锁来将语句块标记为关键部分。该声明采用以下形式:
所以基本上你应该锁定一个对象。因此,如果您想拥有锁,则应该拥有一个锁定的特定对象,例如HashTable
或专门用于锁定的共享object
等容器。
通过锁定typeof(DateTime)
的结果,您说没有其他对象可以锁定该类型。这是一个过于粗糙的锁 - 换句话说,你的代码应能够锁定代码中其他地方的另一个DateTime
对象,但你的方法不会是可能的。
答案 2 :(得分:1)
除了已经提到的原因之外,可以在同一进程中的不同AppDomain之间共享Type对象。因此,在不同的AppDomain中运行的代码可能会使您的应用程序陷入僵局。
对此here进行了一些讨论。