线程失效时的锁定状态
本文关键字:锁定 状态 失效 线程 | 更新日期: 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);
}