我试图创建一个死锁的例子。我试了下面的代码。但不是造成僵局,而是像魅力一样。帮助我理解为什么它不会造成僵局。这段代码中的变化会导致死锁?多线程中的死锁
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace ReferenceTypes
{
class DeadLockExample
{
static int a;
static int b;
public static void Main(string[] args)
{
DeadLockExample.a = 20;
DeadLockExample.b = 30;
DeadLockExample d = new DeadLockExample();
Thread tA = new Thread(new ThreadStart(d.MethodA));
Thread tB = new Thread(new ThreadStart(d.MethodB));
tA.Start();
tB.Start();
Console.ReadLine();
}
private void MethodA()
{
lock (this)
{
Console.WriteLine(a);
Thread.Sleep(1000);
Console.WriteLine(b);
}
}
private void MethodB()
{
lock (this)
{
Console.WriteLine(b);
Thread.Sleep(1000);
Console.WriteLine(a);
}
}
}
}
除事实睡觉不保证* *发生死锁(仅同步可以做到这一点),这是一个伟大的答案:) – 2010-08-19 23:37:19
我很欣赏的答案。谢谢。 – SaravananArumugam 2010-08-19 23:41:36
这是典型的死锁例子。实际上,大多数死锁看起来与此完全相同,除了锁定采集在通过您甚至没有意识到正在运行的线程上的计时器事件的回调进行路由后,堆栈跟踪中通常至少有8次调用。 – 2010-08-19 23:45:13