C#中多线程同步的Monitor理解
.NET提供了System.Threading.Monitor类允许同一进城中的线程实现同步,是一种更快速、更轻量级的锁机制。可以使用该类来保护对某些变量的访问,或对某些一次只能在一个线程中执行的代码设置访问权限。
使用实例(片段代码):
readonly object theLock=new object();int num=0;#其他代码...Monitor.Enter(theLock);try{++num;}finally{Monitor.Exit(theLock);}
- Monitor与lock
对以上代码的解读:- Monitor.Enter(theLock)获得theLock对象锁;Monitor.Exit(theLock)释放theLock对象锁;
- 我们将所有对num变量的访问以对象锁的形式房在临界区,在每次访问前,访问者必须获得theLock对象实例的锁。theLock字段类型是 Object类型,它的实际类型无关紧要,但必须是引用类型即对象的实例,而不是值类型。为了安全起见,建议标记成readonly,以免theLock 被复制而造成混乱。
- 上述代码不够简洁,使用try/finally,而且一旦漏掉Monitor.Exit将会发生可怕的混乱。就此问题C#设计者引用了lock关键字,lock关键字代替了Monitor.Enter和Monitor.Exit,上述代码可简写为:
readonly object theLock=new object();int num=0;#其他代码...lock(theLock){++num;}
- 通知与等待
- Monitor管理着两个线程队列:就绪队列(ready队列)和等待队列(waiting队列)。
- ready队列保存的是准备获取锁的线程,就是说,如果某个线程(几座线程A)执行了Monitor.Wait(),那么ready队列中的第一个线程就会获得锁,开始运行;同时线程A自动进入waiting队列中的队尾进行排队。
- waiting队列保存的是正在等待锁对象状态变化通知的线程,就是说如果某个线程执行了Moniotr.Pulse(),那么waiting队列中的对头线程就进入ready队列中。
- 简单地说即是当前线程执行Monitor.Wait(),当前线程进入waiting队列并取ready队列对头线程运行;执行Monitor.Pulse把waiting队列的对头线程调入ready队列。
转载于:https://www.cnblogs.com/zhaiqianfeng/archive/2012/11/06/4617989.html
C#中多线程同步的Monitor理解相关推荐
- java 线程 john_教你Java开发中多线程同步技巧
教你Java开发中多线程同步技巧 在编写一个类时,如果该类中的代码可能运行于多线程环境下,那么就要考虑同步的问题.在Java中内置了语言级的同步原语--synchronized,这也大大简化了Java ...
- XCP协议中关于同步数据传输的理解和应用
根据数据传输的方向不同,XCP协议中,同步数据传输可以分为如下两种类型: DAQ: ECU(slave)向上位机(master)发送数据,实现数据采集 STIM: 上位机(master)向ECU(sl ...
- Windows中多线程同步之事件(Event)
可用事件来当做同步的依据,需使用以下函数 CreatEvent():创建一个事件对象 SetEvent():把指定事件对象的状态设置为发信号状态 ResetEvent():把指定事件对象的状态设置为不 ...
- Delphi关于多线程同步的一些方法
(注:本文为转载 http://hi.baidu.com/navy1130/blog/item/468fcdc448794fce38db49ee.html) 线程是进程内一个相对独立的.可调度的执行 ...
- idea 断点线程_在IntelliJ IDEA中多线程并发代码的调试方法
通常来说,多线程的并发及条件断点的debug是很难完成的,或许本篇文章会给你提供一个友好的调试方法.让你在多线程开发过程中的调试更加的有的放矢. 我们将通过一个例子来学习.在这里,我编写了一个多线程程 ...
- C#中的多线程 - 同步基础
C#中的多线程 - 同步基础 C#中的多线程 - 同步基础 1同步概要 在第 1 部分:基础知识中,我们描述了如何在线程上启动任务.配置线程以及双向传递数据.同时也说明了局部变量对于线程来说是私有的, ...
- 多线程:C#线程同步lock,Monitor,Mutex,同步事件和等待句柄(上)
多线程:C#线程同步lock,Monitor,Mutex,同步事件和等待句柄(上) 转自 http://www.cnblogs.com/freshman0216/archive/2008/07/27/ ...
- 看了这个有趣的例子,你就能秒懂Java中的多线程同步了!
作者:智慧zhuhuix cnblogs.com/zhuhuix/p/12970326.html 写在前面 把技术概念通过文字的形式写下来,理清逻辑,加深认知: 把知识点通过系列文章的形式分段写下来, ...
- [转]关于java中的 sychronized 同步方法 与 同步块的理解
首先,需要说明一点,也是最重要的一点,无论是同步方法 还是 同步块 都是只针对同一个对象的多线程而言的,只有同一个对象产生的多线程,才会考虑到 同步方法 或者是 同步块,如果定义多个实例的同步,可以考 ...
最新文章
- MP4文件格式带数据详解
- Android客户端打包方案分享
- 最全.Net学习资料库上线,今日可免费下载各类资源!(附百度云链接)
- 马斯克脑机接口_马斯克的脑机接口,让我倍感担忧
- java 原子类能做什么_死磕 java原子类之终结篇(面试题)
- 软件工程复习提纲——第七章
- 95-38-050-Buffer-UnpooledHeapByteBuf
- uniapp ---- 树组件
- ENVI入门系列教程---一、数据预处理---7.图像镶嵌
- 深度丨语音识别技术专利申请分析及关键技术展望(上)
- 计算机网络13--网络应用的体系结构
- 如何提升原创文章排名与百度冰桶算法
- 微信小程序对接串口摄像头
- 实训日记(二)——分镜
- “文心一言”和“ChatGPT”两者有何差距?
- 小白必看:三层交换机实现VLAN互通实验(图文并茂)
- JSON和list之间的转换
- Simditor固定高度,禁止拉伸,开启滚动条效果
- Windows同步任意个人文件夹到OneDrive
- php 节假日判断,php日期节假日换算的实例分析
热门文章
- XML 数据 BCP方式大批量的上传--学习(一)
- SQL Try Catch
- 学习Struts 2.0系列文章
- math_functions
- Java机器学习库ML之十模型选择准则AIC和BIC
- mysql解释器优化_MySQL——SQL性能分析优化利器之Explain
- javascript等待异步线程完成_JavaScript 中的异步原理
- Python 技术篇-在cmd命令提示行里模拟动态下载进度条实例演示,cmd清除日志、打印动态内容方法
- leetcode C++ 48. 旋转图像 给定一个 n × n 的二维矩阵表示一个图像。 将图像顺时针旋转 90 度。
- 第五周实践项目6 数制转换(栈)