线程崩溃持有锁(SyncObject)会发生什么?

时间:2014-03-09 13:30:23

标签: c# locking deadlock

我在锁(SyncRoot){...}中有一些代码,如果线程在lock(){}语句内部崩溃,那么锁将永久保持还是在线程时自动重新发布“离开”该块,即使它是一个未处理的例外?

1 个答案:

答案 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值得称赞。