我将使用C#锁定语句,我想知道我是否在锁定内部调用函数,并且该函数也会锁定同一个对象,程序会冻结吗?
例如:
Object object;
public void f0()
{
f1(object);
}
public void f1(Object obj1)
{
lock (obj1) {
f2(obj1);
}
}
public void f2(Object obj2)
{
lock(obj2) {
/// do operations using obj2
}
}
这里函数f0调用函数f1执行锁定,在锁定内部调用f2也执行锁定。那么程序会在f2中冻结,等待f1中锁定的对象吗?
我有一个大型程序,函数调用彼此传递对象,我需要锁定一些对象,但可能会发生我调用的函数也可能锁定同一个对象,因此它可能被锁定两次,导致可能死锁。
可能很难知道相同的物体是否被传递并且可能最终被锁定两次。
此外,我的程序还有多线程和多个类。
此外,如果一个线程在锁中获得异常,它会以某种方式展开并自行修复吗?
有人知道这样做的正确方法吗?我有一个很大的程序,所以在我开始改变一切之前,我决定最好找到正确的方法。
由于
答案 0 :(得分:4)
Monitor
(由封面下的lock
语句使用)是可重入的,因此技术上可以让同一个线程多次锁定一个对象。外部lock
范围完成时将释放锁定。但是,重入锁是很难推理的,除非你没有其他选择,否则应该避免使用。
由于重入锁定而不会发生死锁。它们在您取出多个对象上的锁时发生,而另一些线程以不同的顺序锁定相同的对象。
答案 1 :(得分:0)
锁定对象使其成为单线程代码,可用于防止混淆或过早计算(这只是一个示例)。