我在锁(SyncRoot){...}中有一些代码,如果线程在lock(){}语句内部崩溃,那么锁将永久保持还是在线程时自动重新发布“离开”该块,即使它是一个未处理的例外?
答案 0 :(得分:1)
lock(obj) { ... }
只是
Monitor.Enter(obj);
try
{ ... }
finally
{
Monitor.Exit(obj);
}
并在C#4.0中将其更改为
bool acquaired = false;
try
{
Monitor.Enter(obj, ref acquired);
...
}
finally
{
if (acquired)
{
Monitor.Exit(obj)
}
}
现在,在.Net 4.0之前,ThreadAbortException
可能会在Monitor.Enter(obj);
和try块的开头之间抛出 - 这会产生死锁(这意味着,没有线程可以访问锁,他们将保持阻止)。现在即使这是不可能的。无论如何,如果在锁内部抛出异常,则会发生事件,因为finally块会释放锁。
**我相信@Jon Skeet值得称赞。