using System;
using System.Threading;
namespace ConsoleHelper
{
public class Program
{
public static void Main(string[] args)
{
object lock1 = new object();
object lock2 = new object();
Console.WriteLine("---------------- Monitor类 --------------------------");
new Thread(() => LockTooMuch(lock1, lock2)).Start(); // 1. 锁定第一个对象,一秒后锁定第二个对象
lock (lock2) // 2. 锁定第二个对象
{
Thread.Sleep(1000);
Console.WriteLine("Monitor.TryEnter allows not to get stuck, " +
"returning false after a specified time out is elapsed.");
if (Monitor.TryEnter(lock1, TimeSpan.FromSeconds(3))) // 3. 规定时间内,获取排他锁
Console.WriteLine("Acquired a protected resource succesfully!");
else
Console.WriteLine("Timeout acquiring a resource!"); // 4. 由于死锁,获取锁timeout了
}
Console.ReadLine();
Console.WriteLine("----------------Lock 语法糖--------------------------");
new Thread(() => LockTooMuch(lock1, lock2)).Start(); // 1. 锁定第一个对象,一秒后锁定第二个对象
lock (lock2) // 2. 锁定第二个对象
{
Console.WriteLine("This will be a deadLock!");
Thread.Sleep(1000);
lock (lock1) // 3. 始终获取不到lock1的锁,处于挂起状态
{
Console.WriteLine("Acquired a protected resource successfully!");
}
}
Console.ReadLine();
}
// lock 死锁逻辑
public static void LockTooMuch(object lock1, object lock2)
{
lock (lock1)
{
Thread.Sleep(1000); // 逻辑
lock (lock2) { }
}
}
}
}
Monitor执行过程:
1. 锁定第一个对象,一秒后锁定第二个对象
2. 锁定第二个对象
3. 规定时间内,获取排他锁
4. 由于死锁,获取锁timeout了
Lock的执行过程
1. 锁定第一个对象,一秒后锁定第二个对象
2. 锁定第二个对象
3. 始终获取不到lock1的锁,处于挂起状态