线程失效时的锁定状态

本文关键字:锁定 状态 失效 线程 | 更新日期: 2023-09-27 17:59:43

我四处寻找SO和web的答案,但只找到了一个适用于其他语言(c++、python)的答案,阅读并没有提供足够清晰的答案。

如果一个线程有一个被锁定的代码块,而该线程在被锁定的块内时由于某种原因而死亡(被强制杀死),那么该锁还会被强制执行吗(即,其他线程将无法使用该锁)?

例如:

class myClass {
    private static object myLock = new Object();
    public void foobar()
    { 
        lock(myLock)
        {
            //code
        }
    }
}

如果线程A死了,线程B试图调用foobar,它能调用吗?还是会陷入僵局?

线程失效时的锁定状态

报表

lock(myLock)
{
    //code
}

相当于

System.Threading.Monitor.Enter(myLock);
try 
{ 
    //code
}
finally 
{ 
    System.Threading.Monitor.Exit(myLock); 
}

所以,如果一个线程死了,那么就会抛出异常,finally语句就会释放对象myLock的锁。

请参阅Monitor类的文档,它对锁定概念有很好的解释和示例。

锁语句被转换为使用组合Monitor进行最终尝试。进入Monitor。如下图所示退出,当异常发生或未发生时,最终在这两种情况下执行,以确保锁被释放。Eric Lippert的这个回答解释了c#中的锁实现。

System.Threading.Monitor.Enter(x);
try {
   ...
}
finally {
   System.Threading.Monitor.Exit(x);
}