C#锁定声明

时间:2017-07-27 23:52:51

标签: c# multithreading

我将使用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中锁定的对象吗?

我有一个大型程序,函数调用彼此传递对象,我需要锁定一些对象,但可能会发生我调用的函数也可能锁定同一个对象,因此它可能被锁定两次,导致可能死锁。

可能很难知道相同的物体是否被传递并且可能最终被锁定两次。

此外,我的程序还有多线程和多个类。

此外,如果一个线程在锁中获得异常,它会以某种方式展开并自行修复吗?

有人知道这样做的正确方法吗?我有一个很大的程序,所以在我开始改变一切之前,我决定最好找到正确的方法。

由于

2 个答案:

答案 0 :(得分:4)

Monitor(由封面下的lock语句使用)是可重入的,因此技术上可以让同一个线程多次锁定一个对象。外部lock范围完成时将释放锁定。但是,重入锁是很难推理的,除非你没有其他选择,否则应该避免使用。

由于重入锁定而不会发生死锁。它们在您取出多个对象上的锁时发生,而另一些线​​程以不同的顺序锁定相同的对象。

答案 1 :(得分:0)

锁定对象使其成为单线程代码,可用于防止混淆或过早计算(这只是一个示例)。