【发布时间】:2016-04-19 07:10:50
【问题描述】:
我在使用 Monitor.Enter 和 Monitor.Exit 时似乎遇到了并发问题。有时我的代码会挂在下面的 Monitor.Exit 语句上:
public void EndInit()
{
Monitor.Enter(this.lockObj);
this.initCount--;
if (this.initCount == 0) {
this.IsInitializing = false;
this.IsInitialized = true;
this.OnInitialized();
}
// sometimes, this Exit will never return ...
Monitor.Exit(this.lockObj);
}
只有另外一个地方使用了我的 lockObj:
public void BeginInit()
{
Monitor.Enter(this.lockObj);
this.initCount++;
this.IsInitializing = true;
this.IsInitialized = false;
Monitor.Exit(this.lockObj);
}
这就是我声明这个同步对象的方式:
private readonly object lockObj = new object();
我竭尽全力想知道这里发生了什么,但没有成功。我希望Monitor.Enter() 会阻止直到我的同步对象被释放,但为什么Monitor.Exit() 会被阻止?我在 MSDN 中也找不到对这种行为的任何解释。
注意我无法重现这种行为,它是随机发生的(好吧,我知道“随机”不是正确的措辞)。
非常感谢任何想法或有用的提示!
索斯滕
【问题讨论】:
-
如果可能,您可以将
Monitor.Enter/Monitor.Exit组合替换为lock() { }块。如果在Monitor.Exit调用之前抛出异常会发生什么?
标签: c# multithreading locking