代码之家  ›  专栏  ›  技术社区  ›  taracus

当线程持有锁(SyncObject)崩溃时会发生什么?[副本]

  •  -1
  • taracus  · 技术社区  · 11 年前

    我在一个锁(SyncRoot){…}中有一些代码,如果线程在lock(){}语句中崩溃,那么该锁将永远保持,还是在线程“离开”块时自动释放,即使是由于未处理的异常?

    1 回复  |  直到 11 年前
        1
  •  1
  •   Shlomi Borovitz    11 年前

    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应该为此付出代价。