1.Monitor.Wait方法
当线程调用 Wait 时,它释放对象的锁并进入对象的等待队列,对象的就绪队列中的下一个线程(如果有)获取锁并拥有对对象的独占使用。Wait()就是交出锁的使用权,使线程处于阻塞状态,直到再次获得锁的使用权。

2.Monitor.Pulse方法
当前线程调用此方法以便向队列中的下一个线程发出锁的信号。接收到脉冲后,等待线程就被移动到就绪队列中。在调用 Pulse 的线程释放锁后,就绪队列中的下一个线程(不一定是接收到脉冲的线程)将获得该锁。pulse()并不会使当前线程释放锁。

注意:

共用同一lock对象两线程不能只调用Wait(),Wait这个方法反而放弃了锁的使用权,同时阻塞当前线程,线程就直接休眠(进入WaitSleepJoin状态) ,同时在主线程中Join这个work线程时,也就一直不能返回了。线程将一直阻塞。

当一个线程尝试着lock一个同步对象的时候,该线程就在就绪队列中排队。一旦没人拥有该同步对象,就绪队列中的线程就可以占有该同步对象。这也是我们平时最经常用的lock方法。
为了其他的同步目的,占有同步对象的线程也可以暂时放弃同步对象,并把自己流放到等待队列中去。这就是Monitor.Wait。由于该线程放弃了同步对象,其他在就绪队列的排队者就可以进而拥有同步对象。
比起就绪队列来说,在等待队列中排队的线程更像是二等公民:他们不能自动得到同步对象,甚至不能自动升舱到就绪队列。而Monitor.Pulse的作用就是开一次门,使得一个正在等待队列中的线程升舱到就绪队列;相应的Monitor.PulseAll则打开门放所有等待队列中的线程到就绪队列。

我们知道lock实际上一个语法糖糖,C#编译器实际上把他展开为Monitor.Enter和Monitor.Exit。但是,这种实现逻辑至少理论上有一个错误:当Monitor.Enter(lockObj);刚刚完成,还没有进入try区的时候,有可能从其他线程发出了Thread.Abort等命令,使得该线程没有机会进入try...finally。也就是说lockObj没有办法得到释放,有可能造成程序死锁。这也是Thread.Abort一般被认为是邪恶的原因之一。

DotNet4开始,增加了Monitor.Enter(object,ref bool)重载。而C#编译器会把lock展开为更安全的Monitor.Enter(object,ref bool)和Monitor.Exit。

现在Monitor.TryEnter在try的保护下,“加锁”成功意味着“放锁”将得到finally的保护。

最新文章

  1. 容器化redis高可用方案
  2. Installshield如何实现升级覆盖文件
  3. JavaWeb---总结(七)HttpServletResponse对象(一)
  4. 20145304 刘钦令 Java程序设计第一周学习总结
  5. ArrayList类的实现
  6. Leetcode 160 Intersection of Two Linked Lists 单向链表
  7. 【插件开发】—— 1 Eclipse插件开发导盲
  8. win8双屏敲代码
  9. 解决 Ubuntu 开机 Waiting for 60 seconds more for network configuration
  10. Monkey学习笔记<四>:Monkey服务器命令
  11. POJ 1797 Heavy Transportation(Dijkstra变形——最长路径最小权值)
  12. 实验一 windows基本网络命令
  13. springboot整合mybatis的多数据源解决办法
  14. es6中的模块化
  15. HCNA之网络通信基础
  16. 【JMeter】集合点的设置
  17. python-day49--前端 css-层叠样式表
  18. websocket protocal
  19. [心平气和读经典]The TCP/IP Guide(004)
  20. Spring核心技术AOP案例

热门文章

  1. IDEA中设置背景图片(超详细)
  2. 齐博x1标签之无刷新显示更多
  3. OpenAPI 接口幂等实现
  4. Droplet——一款轻量的Golang应用层框架
  5. 二、Kubernetes 概念介绍
  6. 基于PCIe DMA的多通道数据采集和回放IP
  7. 河北首家城商行传统核心业务国产化,TDSQL突破三“最”为秦皇岛银行保驾护航
  8. 本地文件上传Gitee
  9. 图文详解在VMware Workstation 16 PRO虚拟机上安装Rocky 8.6 linux系统
  10. Redux 的困扰与如何技术选型