.NET提供了System.Threading.Monitor类允许同一进城中的线程实现同步,是一种更快速、更轻量级的锁机制。可以使用该类来保护对某些变量的访问,或对某些一次只能在一个线程中执行的代码设置访问权限。
使用实例(片段代码):

readonly object theLock=new object();int num=0;#其他代码...Monitor.Enter(theLock);try{++num;}finally{Monitor.Exit(theLock);}

  • Monitor与lock
    对以上代码的解读:

    1. Monitor.Enter(theLock)获得theLock对象锁;Monitor.Exit(theLock)释放theLock对象锁;
    2. 我们将所有对num变量的访问以对象锁的形式房在临界区,在每次访问前,访问者必须获得theLock对象实例的锁。theLock字段类型是 Object类型,它的实际类型无关紧要,但必须是引用类型即对象的实例,而不是值类型。为了安全起见,建议标记成readonly,以免theLock 被复制而造成混乱。
    3. 上述代码不够简洁,使用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理解相关推荐

  1. java 线程 john_教你Java开发中多线程同步技巧

    教你Java开发中多线程同步技巧 在编写一个类时,如果该类中的代码可能运行于多线程环境下,那么就要考虑同步的问题.在Java中内置了语言级的同步原语--synchronized,这也大大简化了Java ...

  2. XCP协议中关于同步数据传输的理解和应用

    根据数据传输的方向不同,XCP协议中,同步数据传输可以分为如下两种类型: DAQ: ECU(slave)向上位机(master)发送数据,实现数据采集 STIM: 上位机(master)向ECU(sl ...

  3. Windows中多线程同步之事件(Event)

    可用事件来当做同步的依据,需使用以下函数 CreatEvent():创建一个事件对象 SetEvent():把指定事件对象的状态设置为发信号状态 ResetEvent():把指定事件对象的状态设置为不 ...

  4. Delphi关于多线程同步的一些方法

    (注:本文为转载  http://hi.baidu.com/navy1130/blog/item/468fcdc448794fce38db49ee.html) 线程是进程内一个相对独立的.可调度的执行 ...

  5. idea 断点线程_在IntelliJ IDEA中多线程并发代码的调试方法

    通常来说,多线程的并发及条件断点的debug是很难完成的,或许本篇文章会给你提供一个友好的调试方法.让你在多线程开发过程中的调试更加的有的放矢. 我们将通过一个例子来学习.在这里,我编写了一个多线程程 ...

  6. C#中的多线程 - 同步基础

    C#中的多线程 - 同步基础 C#中的多线程 - 同步基础 1同步概要 在第 1 部分:基础知识中,我们描述了如何在线程上启动任务.配置线程以及双向传递数据.同时也说明了局部变量对于线程来说是私有的, ...

  7. 多线程:C#线程同步lock,Monitor,Mutex,同步事件和等待句柄(上)

    多线程:C#线程同步lock,Monitor,Mutex,同步事件和等待句柄(上) 转自 http://www.cnblogs.com/freshman0216/archive/2008/07/27/ ...

  8. 看了这个有趣的例子,你就能秒懂Java中的多线程同步了!

    作者:智慧zhuhuix cnblogs.com/zhuhuix/p/12970326.html 写在前面 把技术概念通过文字的形式写下来,理清逻辑,加深认知: 把知识点通过系列文章的形式分段写下来, ...

  9. [转]关于java中的 sychronized 同步方法 与 同步块的理解

    首先,需要说明一点,也是最重要的一点,无论是同步方法 还是 同步块 都是只针对同一个对象的多线程而言的,只有同一个对象产生的多线程,才会考虑到 同步方法 或者是 同步块,如果定义多个实例的同步,可以考 ...

最新文章

  1. MP4文件格式带数据详解
  2. Android客户端打包方案分享
  3. 最全.Net学习资料库上线,今日可免费下载各类资源!(附百度云链接)
  4. 马斯克脑机接口_马斯克的脑机接口,让我倍感担忧
  5. java 原子类能做什么_死磕 java原子类之终结篇(面试题)
  6. 软件工程复习提纲——第七章
  7. 95-38-050-Buffer-UnpooledHeapByteBuf
  8. uniapp ---- 树组件
  9. ENVI入门系列教程---一、数据预处理---7.图像镶嵌
  10. 深度丨语音识别技术专利申请分析及关键技术展望(上)
  11. 计算机网络13--网络应用的体系结构
  12. 如何提升原创文章排名与百度冰桶算法
  13. 微信小程序对接串口摄像头
  14. 实训日记(二)——分镜
  15. “文心一言”和“ChatGPT”两者有何差距?
  16. 小白必看:三层交换机实现VLAN互通实验(图文并茂)
  17. JSON和list之间的转换
  18. Simditor固定高度,禁止拉伸,开启滚动条效果
  19. Windows同步任意个人文件夹到OneDrive
  20. php 节假日判断,php日期节假日换算的实例分析

热门文章

  1. XML 数据 BCP方式大批量的上传--学习(一)
  2. SQL Try Catch
  3. 学习Struts 2.0系列文章
  4. math_functions
  5. Java机器学习库ML之十模型选择准则AIC和BIC
  6. mysql解释器优化_MySQL——SQL性能分析优化利器之Explain
  7. javascript等待异步线程完成_JavaScript 中的异步原理
  8. Python 技术篇-在cmd命令提示行里模拟动态下载进度条实例演示,cmd清除日志、打印动态内容方法
  9. leetcode C++ 48. 旋转图像 给定一个 n × n 的二维矩阵表示一个图像。 将图像顺时针旋转 90 度。
  10. 第五周实践项目6 数制转换(栈)