多线程之Monitor关键字

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的锁,处于挂起状态

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值