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

C#中的LOCK

一、LOCK概念理解

  1.  竞争同一锁的线程会互斥访问
  2. 不竞争锁的线程不受影响
  3.  加锁代码块的修改对其他遵守锁协议的线程表现为原子操作
  4. 不同于FreeRTOS中的临界区,加锁之后其他的线程还是可以正常运行,只有竞争同一把锁的线程才会阻塞
  5. 功能等同于FreeRTOS中的互斥锁,如果A线程加锁,其他线程还要访问这一把锁,就会被阻塞,但是不影响不访问这一把锁的线程
  6. 他和FreeRTOS中的二值信号量最大的区别就是,lock规定,谁加的锁就只能是谁释放,但是二值信号量就是所有线程都可以解锁和加锁,这一点lock和互斥锁一样。

二、实例说明

using System;
using System.Threading;class LockExample
{// 共享资源private static int _value = 0;private static readonly object _lock = new object();static void Main(){// 线程1:频繁修改共享资源new Thread(() => {while (true){_value = 0;lock (_lock){_value = 1;  // 状态AThread.Sleep(100);_value = 2;  // 状态BThread.Sleep(100);_value = 3;  // 状态A}}}).Start();// 线程2:尝试获取同一把锁new Thread(() => {while (true){lock (_lock)  // 会阻塞直到获取锁{Console.WriteLine($"Thread2 sees: {_value}");}Thread.Sleep(50);}}).Start();// 线程3:不竞争锁,直接读取共享资源new Thread(() => {while (true){Console.WriteLine($"Thread3 sees: {_value}"); // 可能看到中间状态!Thread.Sleep(50);}}).Start();}
}

观看上述的代码,

由于线程1和线程2竞争同一把锁,所以导致这两个锁中的代码只能被互斥访问,即线程2中输出的value值只能是0或者3,但是基本不会输出0,因为将value=0后马上就执行锁的内容。

线程3没有遵守锁的协议,因此它可以输出1,2,3,0,这些输出的结果都是随机的。

http://www.dtcms.com/a/344185.html

相关文章:

  • 关于 WebDriver Manager (自动管理浏览器驱动)
  • 第二阶段Winform-4:MDI窗口,布局控件,分页
  • 3.4 缩略词抽取
  • 企业级 AI 智能体安全落地指南:从攻击面分析到纵深防御体系构建
  • FileCodeBox 文件快递柜 一键部署
  • 获取后台返回的错误码
  • 如何使用命令行将DOCX文档转换为PDF格式?
  • Linux应用软件编程---网络编程1(目的、网络协议、网络配置、UDP编程流程)
  • Matplotlib 可视化大师系列(八):综合篇 - 在一张图中组合多种图表类型
  • 2.4G和5G位图说明列表,0xff也只是1-8号信道而已
  • QT QImage 判断图像无效
  • 高通平台WIFI学习-- 基于高通基线如何替换移植英飞凌WIFI芯片代码
  • mysql编程(简单了解)
  • 【Android】include复用布局 在xml中静态添加Fragment
  • 计数组合学7.20(平面分拆与RSK算法)
  • [测试技术] 接口测试中如何高效开展幂等性测试
  • pthon实现bilibili缓存视频音频分离
  • Redis内存碎片深度解析:成因、检测与治理实战指南
  • K8s存储类(StorageClass)设计与Ceph集成实战
  • 为什么应用会突然耗尽所有数据库连接
  • 智慧清洁时代来临:有鹿机器人重新定义城市清洁标准
  • 【数据结构】B 树——高度近似可”独木成林“的榕树——详细解说与其 C 代码实现
  • python selenium+pytest webUI自动化基础框架
  • 去中心化身份--改变格局的关键
  • 图数据库(neo4j)基础: 分类/标签 节点 关系 属性
  • 整数规划学习总结
  • 为什么给数据表加了索引,写入速度反而变慢了
  • 数据库原理及应用_数据库基础_第2章关系数据库标准语言SQL_数据查询(3)连接查询
  • 基于Python/django的仓库库存管理系统#基于Python的仓库管理系统#基django的J进销存管理系统
  • 力扣热题之贪心算法