".NET 线程安全性"

7
为什么锁定类型被认为是非常糟糕的? 例如,lock(typeof(DateTime)) 我理解在.net中任何类的静态方法都被认为是线程安全的,而实例成员则不是。因此,在使用DateTime时不需要锁定它。我正在阅读的书没有解释为什么这样做是错误的,只是说这样做是错误的。任何解释都将是很好的。
3个回答

9

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

由于您无法控制对类型的访问,因此您可能会发现自己无意中阻塞或受到与完全无关的代码的阻塞,该代码也锁定了您的类型。

相反,您通常应该锁定同一类中与操作(或相关操作)相关的私有实例,以便您可以控制锁定所影响和阻止的内容。(虽然也有一些情况下,将锁定某些公认的同步对象是跨不同对象使用的。)


那么为什么允许这样做呢?是否有真正的需要这样做呢? - Gabriel Magana
1
因为在.NET中,您可以锁定任何对象。为什么要添加额外的检查呢? - Matti Virkkunen

2

来自MSDN

使用lock关键字可以将语句块标记为临界区,通过获取给定对象的互斥锁、执行语句,然后释放锁。该语句的形式如下:

基本上你需要锁定一个对象。如果你想要锁定一个对象,你应该有一个特定的对象来进行锁定,例如一个容器,比如一个HashTable或者专门用于锁定的共享object

通过锁定typeof(DateTime)的结果,你在说没有其他对象可以对该类型进行锁定。这是一种过于粗略的锁定方式 - 换句话说,你的代码应该能够在代码中的其他地方锁定另一个DateTime对象,但是使用你的方法将不可能实现。


1
除了已经提到的原因外,类型对象可以在同一进程中的不同应用程序域之间共享。因此,在不同应用程序域中运行的代码可能会导致您的应用程序死锁。
这里有一些讨论here

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接