lock 的一个问题,求解答!

sevenlee4125 2013-10-18 09:44:13
对于只有一个线程中,如果对一个对象进行两次lock,会不会导致死锁
例如

class Program
{
private static readonly object obj = new object();
static void Main(string[] args)
{
lock (obj)//获取obj锁
{
lock (obj)//获取obj锁失败?以下代码不会执行?但实际上是可以执行的
{
Console.WriteLine("hello");
}
}
Console.Read();
}

}

我以为在第二个lock(obj)中的代码块会无限等待,这里会死锁,但实际不是,可以输出hello的
这处有点不太理解,求解释!
...全文
115 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
逸世尘角 2013-10-18
  • 打赏
  • 举报
回复
首先,lock用于多线程编程中的线程同步,在该程序(单线程)里没有使用lock的必要 在你的程序里 第一个lock获取了锁,也就是在lock{}里面的代码都是拥有锁资源的,所以在lock{}里面再次使用lock变成 lock{lock}形式,第二层lock也是拥有锁资源的,可以执行 lock的实质就是对System.Threading.Monitor的封装,lock(obj){}相当于 try { Monitor.Enter(obj); } finally { Monitor.Exit(obj); },所以以上代码可以写成: try { Monitor.Enter(obj); try { Monitor.Enter(obj); Console.WriteLine("hello"); } finally { Monitor.Exit(obj); } } finally { Monitor.Exit(obj); } 第二次Enter锁obj的时候,肯定是成功的了。
sevenlee4125 2013-10-18
  • 打赏
  • 举报
回复
引用 3 楼 yyantifa 的回复:
lock防止并发操作,你在单线程里面。只有一个一个线程访问,所以不需要lock。
感谢你的回答
sevenlee4125 2013-10-18
  • 打赏
  • 举报
回复
引用 2 楼 u011130289 的回复:
楼主还没弄清楚lock的用法吧
刚开始真正的去了解多线程,以前用的好少,而且用的浅,呵呵
yyantifa 2013-10-18
  • 打赏
  • 举报
回复
lock防止并发操作,你在单线程里面。只有一个一个线程访问,所以不需要lock。
Regan-lin 2013-10-18
  • 打赏
  • 举报
回复
楼主还没弄清楚lock的用法吧
cheng2005 2013-10-18
  • 打赏
  • 举报
回复
lock是指多线程之前的访问控制,同一线程没有lock的概念。

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧