我已经环顾了SO和网络寻找答案,但只找到了其他语言(c ++,python)并且阅读并没有提供足够明确的答案。
如果一个线程有一个被锁定的代码块,并且该线程因为某种原因(强制被杀死)而在它处于锁定块内时会死亡,那么锁定是否仍会被强制执行(即其他线程不会被强制执行)能够使用获得那个锁?)
如:
class myClass {
private static object myLock = new Object();
public void foobar()
{
lock(myLock)
{
//code
}
}
}
如果线程A死亡而线程B试图调用foobar,它能够吗?还是会陷入僵局?
答案 0 :(得分:0)
使用组合Monitor.Enter Monitor.Exit将lock语句转换为try-finally,如下所示,最后在发生异常时执行,以确保锁定被释放。来自answer的Eric Lippert解释了c#中的锁实现。
System.Threading.Monitor.Enter(x);
try {
...
}
finally {
System.Threading.Monitor.Exit(x);
}
答案 1 :(得分:0)
声明
lock(myLock)
{
//code
}
相当于
System.Threading.Monitor.Enter(myLock);
try
{
//code
}
finally
{
System.Threading.Monitor.Exit(myLock);
}
因此,如果线程死亡,则会抛出异常,finally
语句将从对象myLock
释放锁。
参见Monitor class的文档,它有关于锁定概念的很好的解释和示例。