当前位置:  开发笔记 > 编程语言 > 正文

使用foreach的奇怪的lock()行为

如何解决《使用foreach的奇怪的lock()行为》经验,为你挑选了1个好方法。

所以,这不是我的代码,并且已缩短以显示行为,但它给出了非常意外的结果.

我在一个类和一个锁中有两个函数

object mylock = new object();
List temp = new List();

Func1(string)
{
  lock(mylock)
  {
    temp.Add(string);
  }
}

Func2()
{
  lock(mylock)
  {
    temp.ForEach(p => Func1(p));
  }
}

现在,我知道这没有意义,但是当调用Func2时,不应该Func1死锁吗?在我们的例子中,它执行.谢谢.



1> Daniel LeChe..:

不,它不应该死锁.

Func1如果有人已经持有锁(如Func2)

锁定的MSDN文档解释说:

"在保持互斥锁定的同时,在同一个执行线程中执行的代码也可以获取并释放锁定.但是,在锁定被释放之前,阻止其他线程中执行的代码获取锁定."

锁定的目的是防止不同的线程访问相同的资源. Func1Func2同一个线程上.

推荐阅读
夏晶阳--艺术
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有