【发布时间】:2013-11-26 13:45:15
【问题描述】:
请仅提供具体答案!我对集合锁定、线程安全等方面的更好(最佳)实践非常熟悉。只是想要一些关于这个特定场景的答案/想法。
我们有一些类型的遗留代码:
public class GodObject
{
private readonly Dictionary<string, string> _signals;
//bunch of methods accessing the dictionary
private void SampleMethod1()
{
lock(_signals)
{
//critical code section 1
}
}
public void SampleMethod2()
{
lock(_signals)
{
//critical code section 2
}
}
}
对字典的所有访问都在这样的锁定语句中。我们遇到了一些错误,如果锁定没有显式工作,可以解释这些错误 - 这意味着 2 个或更多线程同时访问字典。
所以我的问题是 - 是否存在多个线程可以同时访问关键部分的情况?对我来说,这应该是不可能的,因为引用是只读的,所以对象似乎不会发生变化,并且 lock() 周围的大多数问题都与死锁有关,而不是没有发生同步。但也许我错过了一些细微差别或明显的东西?
这是在长期运行的 Windows 服务 .NET Framework 3.5 中运行的。
【问题讨论】:
-
你能参考你得到的错误陈述吗?这可能有助于确定错误,或者如果您可以解释关键部分的内容。
-
很可能一些调用者调用
GodObject的多个方法,期望它们之间没有其他方法运行,并且违反了这种期望。 -
您还没有谈到您遇到的问题。你的问题的答案是否,
Monitor.Enter将只允许一个线程执行临界区,直到调用Monitor.Exit。这就是 lock 语句在内部所做的。 -
请解释你遇到的问题,你提到死锁,你知道导致死锁的一系列事件吗?还有其他方法使用
_signals(即使是只读访问)?现在,正如所写,您的代码不会死锁,也不会出现线程读/写问题,但是您删除了太多细节,因此我们无法告诉您问题出在哪里。 -
您的任何方法是否会在 GodObject 类之外泄漏字典?
标签: c# .net thread-safety