当前位置: 首页 > article >正文

C# 多线程基础 锁 死锁 Monitor lock

设置俩个 共享对象 lock1 lock2 模拟竞争情况
在主线程和子线程 分别使用 monitor 以及 lock 对这俩个对象 分别上锁以及使用
通过 net 8控制台代码实例 看下效果 讲解在代码后

class Program
{

    static void Main(string[] args)
    {
        object lock1 = new object();
        object lock2 = new object();

        new Thread(() => LockOther(lock1, lock2)).Start();

        lock (lock2)
        {
            Thread.Sleep(1000);
            Console.WriteLine("主线程使用Monitor.TryEnter获取锁lock1,获取超时释放");
            if (Monitor.TryEnter(lock1, TimeSpan.FromSeconds(3)))
            {
                Console.WriteLine("主线程Monitor拿到锁lock1");
            }
            else
            {
                Console.WriteLine("主线程Monitor没拿到锁lock1");
            }
        }


        Console.WriteLine("------------第二个案列---------------");
        new Thread(() => LockOther(lock1, lock2)).Start();

        lock (lock2)
        {
            Console.WriteLine("主线程使用lock,会出现死锁后面代码一直不执行");
            Thread.Sleep(2000);
            lock (lock1)
            {
                Console.WriteLine("主线程lock方式拿到锁lock1");
            }
        }

        Console.ReadKey();
    }

    static void LockOther(object lock1, object lock2)
    {
        Console.WriteLine("子线程开始 线程id:" + Thread.CurrentThread.ManagedThreadId);
        lock (lock1)
        {
            Console.WriteLine("子线程锁住lock1");
            Thread.Sleep(1000);
            lock (lock2)
            {
                Console.WriteLine("子线程锁住lock2");
            }

        }
        Console.WriteLine("锁结束");
    }


}

在这里插入图片描述

讲解
正常逻辑 主线程 子线程 在一开始分别 各锁住了一个对象 然后在各自业务中使用另一个对象
那么要使用另一个对象 必须等待释放

案列2
1:代码没有完全都执行 可以看出 在锁住另一个对象后的代码 像是卡住没办法执行了
2:这好像就是正常逻辑情况下会出现的情况 也就是 死锁的定义表现
3:通俗将就是 俩个人都各自锁住一个资源 而恰好 要使用的其他资源 都是对方所持有的,无限等待

案列1
1:第一个案列可以看到 所有的代码逻辑都执行了
2:可以看到主线程是没拿到锁lock1 的 正常逻辑也是子线程拥有的 肯定拿不到
3:说明了Monitor.TryEnter 使用在拿不到的情况下 过期时间会自动放弃获取

总结:
1.死锁 使用lock用法 在两方对于资源 各持有且其他引用无法释放无限等待情况
2.Monitor.TryEnter 提供过期时间 避免无限等待 解决死锁问题
3.lock 是Monitor 语法糖 但是并没提供 TryEnter这种过期写法


http://www.kler.cn/a/503314.html

相关文章:

  • Zookeeper(3)Zookeeper的工作原理是什么?
  • 如何开放2375和2376端口供Docker daemon监听
  • centos修改/etc/resolv.conf 重启network后又恢复到原来的状态
  • CNN张量输入形状和特征图
  • C++基础入门
  • 语音技术与人工智能:智能语音交互的多场景应用探索
  • 【Delete 删除数据语法合集】.NET开源ORM框架 SqlSugar 系列
  • Linux Centos 安装Jenkins到服务
  • java_mybatis_mapper_sql语句示例
  • 如何提升买家秀图片的质量?
  • 在VSCode中设置bash命令行内容简写
  • select 绑定一个对象
  • 浅谈云计算12 | KVM虚拟化技术
  • 第1章 走进Qt Quick的世界
  • Jsoup实现实时爬取
  • 戴尔电脑开机出现MBR和GPT处理
  • 《盘古大模型——鸿蒙NEXT的智慧引擎》
  • ffmpeg 编译遇到的坑
  • 开源临床试验软件OpenClinica的安装
  • x86-64架构的Linux服务器上运行.NET 6.0应用程序,安装runtimes
  • UE5中制作地形材质
  • 按键精灵ios越狱脚本教程:多选框联动的ui界面
  • JavaScript系列(22)--模块化进阶
  • 16. C语言 字符串详解
  • 代码随想录算法训练营第 7 天(哈希表2)| 454.四数相加II 383. 赎金信 15. 三数之和 18. 四数之和
  • 如何知道深度学习模型中,每个模块的功能是什么