static void Main(string[] args)
{
Task.Run(()=> Method1());
Task.Run(() => Method2());
Console.Read();
}
static void Method1()
{
lock (obj1)
{
Console.WriteLine("开始执行方法一");
Thread.Sleep(1000);
lock (obj2)
{
Console.WriteLine("方法一执行完毕");
}
}
}
static void Method2()
{
lock (obj2)
{
Console.WriteLine("开始执行方法二");
Thread.Sleep(1000);
lock (obj1)
{
Console.WriteLine("方法二执行完毕");
}
}
}
结果如下,这两个方法永远都不会执行完毕
3.那么,死锁应该怎么样解决呢?
private static readonly object obj1 = new object();
private static readonly object obj2 = new object();
static void Main(string[] args)
{
Task.Run(()=> Method1());
Task.Run(() => Method2());
Console.Read();
}
static void Method1()
{
try
{
if (Monitor.TryEnter(obj1, 5000))
{
Console.WriteLine("开始执行方法一");
Thread.Sleep(1000);
bool locked = false;
try
{
Monitor.TryEnter(obj2, 5000, ref locked);
Console.WriteLine("方法一执行完毕");
}
finally
{
if (locked)
{
Monitor.Exit(obj2);
}
}
}
}
finally
{
Monitor.Exit(obj1);
}
}
static void Method2()
{
try
{
if (Monitor.TryEnter(obj2, 5000))
{
Console.WriteLine("开始执行方法二");
Thread.Sleep(1000);
bool locked=false;
try
{
Monitor.TryEnter(obj1, 5000,ref locked);
Console.WriteLine("方法二执行完毕");
}
finally
{
if (locked)
{
Monitor.Exit(obj1);
}
}
}
}
finally
{
Monitor.Exit(obj2);
}
}
这样,即使在两个线程都在互相等待资源的情况下,利用超时机制,依然能够使他们放弃当前锁,保证解决死锁问题。
原文:https://www.cnblogs.com/fxw883721/p/14211114.html