公开可见的锁定对象:有时是否有用或指示设计缺陷?

时间:2010-11-25 11:45:44

标签: c# multithreading locking

我正在监控管理某些低级网络通信的软件组件的分包供应。回顾这个组件我发现了这个:

public static object SyncRoot { get { return syncRoot; } }

在这个非常重要的类中,几乎任何方法在执行操作时都使用此锁定对象。现在我想知道这是否是实施这样一个瓶颈的好决定还是毕竟是一个严重的设计缺陷。这不是一种奇怪的多线程程序方式吗?

除了可能死锁的问题是快速锁定?监控efford管理所有这些concurrend线程有多高? 是不是更好(如果某种程度上是必要的)实现类似于同步暂停/恢复方法的东西来让这个类停止/开始从外部工作? 在什么情况下公开可见的锁定对象有用?有没有?

3 个答案:

答案 0 :(得分:2)

公共SyncRoot在MS框架中使用,确实如此,但这是一个实例属性,而不是静态属性。您没有提供有关示例中(静态)SyncRoot属性返回的syncRoot对象的范围或可访问性的任何详细信息。文档(http://msdn.microsoft.com/en-us/library/ms173179.aspx)警告不要锁定公共类型或“超出应用程序控制范围”的对象。在http://www.albahari.com/threading/处有一个关于多线程的非常好的讨论。

答案 1 :(得分:1)

SyncLock本质上是.NET框架中的一个设计缺陷。因此,.NET 2.0集合不直接公开此属性(它是显式实现的,为了向后兼容性而需要)。问题是锁定通常是粒度的,锁定发生在太低的水平。通常,可以通过锁定控制集合的更高级别组件来解决此问题。

使用SyncRoot属性确实存在死锁的变化,因为您无法控制使用者如何使用该锁定对象。他们也可能会长时间锁定,或忘记解锁。暂停/恢复的想法听起来非常可怕。

通常要做的是使组件线程安全。执行此操作时,您将不需要SyncRoot属性。

答案 2 :(得分:0)