管程:并发编程的万能钥匙

  为什么 Java 在 1.5 之前仅仅提供了 synchronized 关键字及 wait()、notify()、notifyAll() 这三个看似从天而降的方法?

  Java 采用的是管程技术,synchronized 关键字及 wait()、notify()、notifyAll() 这三个方法都是管程的组成部分。而管程和信号量是等价的,所谓等价指的是用管程能够实现信号量,也能用信号量实现管程。但是管程更容易使用,所以 Java 选择了管程。

    管程,对应的英文是 Monitor,很多 Java 领域的同学都喜欢将其翻译成“监视器”,这是直译。操作系统领域一般都翻译成“管程”。

    管程,指的是管理共享变量以及对共享变量的操作过程,让他们支持并发。翻译为 Java 领域的语言,就是管理类的成员变量和成员方法,让这个类是线程安全的。

    在管程的发展史上,先后出现过三种不同的管程模型,分别是:Hasen 模型、Hoare 模型和 MESA 模型。其中,现在广泛应用的是 MESA 模型,并且 Java 管程的实现参考的也是 MESA 模型。

    管程解决互斥问题的思路很简单,就是将共享变量及其对共享变量的操作统一封装起来。这是解决了互斥问题,那同步问题呢?

    管程里引入了条件变量的概念,而且每个条件变量都对应有一个等待队列,如下图,条件变量 A 和条件变量 B 分别都有自己的等待队列。

    

notify() 何时可以使用
  所有等待线程拥有相同的等待条件;所有等待线程被唤醒后,执行相同的操作;只需要唤醒一个线程。除非经过深思熟虑,否则尽量使用 notifyAll()。
 
以下由网友总结,我觉得说的比原文清晰,贴一下
  1.管程是一种概念,任何语言都可以通用。
        2.在java中,每个加锁的对象都绑定着一个管程(监视器)
        3.线程访问加锁对象,就是去拥有一个监视器的过程。如一个病人去门诊室看医生,医生是共享资源,门锁锁定医生,病人去看医生,就是访问医生这个共享资源,门诊室其实是监视器(管程)。
        4.所有线程访问共享资源,都需要先拥有监视器。就像所有病人看病都需要先拥有进入门诊室的资格。
        5.监视器至少有两个等待队列。一个是进入监视器的等待队列一个是条件变量对应的等待队列。后者可以有多个。就像一个病人进入门诊室诊断后,需要去验血,那么它需要去抽血室排队等待。另外一个病人心脏不舒服,需要去拍胸片,去拍摄室等待。
        6.监视器要求的条件满足后,位于条件变量下等待的线程需要重新在门诊室门外排队,等待进入监视器。就像抽血的那位,抽完后,拿到了化验单,然后,重新回到门诊室等待,然后进入看病,然后退出,医生通知下一位进入。

总结起来就是,管程就是一个对象监视器。任何线程想要访问该资源,就要排队进入监控范围。进入之后,接受检查,不符合条件,则要继续等待,直到被通知,然后继续进入监视器。

最新文章

  1. 关于zigbee 网络拓扑节点数量的一点说明
  2. September 22nd 2016 Week 39th Thursday
  3. js 中混乱this
  4. 数据人员Sql必会列转行
  5. div设置边框黑框显示
  6. 使用greenDao出现Property 'status' is not part of ********.NewCommentDao@717de9a
  7. C++学习笔记2——引用
  8. Fragment与Activity相互传递数据:
  9. Visual Studio Code 使用Chrome Debug 代码
  10. Selenium 学习笔记(一)
  11. python 将mysql数据库中的int类型修改为NULL 报1366错误,解决办法
  12. 015、调试Dockerfile(2019-01-04 周五)
  13. java_Arrays.sort()方法
  14. 用aws cli 下载s3中数据到本地
  15. ubuntu-Linux下如何安装Tensorflow?
  16. PHP-SESSION深入理解
  17. u3d changeTexs
  18. 最短路径——Dijkstra算法和Floyd算法
  19. 获得Variant类型
  20. win C/C++程序通过Get方式获取网页源代码

热门文章

  1. StringUtil字符串工具-功能扩展
  2. Jenkins - Linux下启动Jenkins报错hudson.WebAppMain#contextDestroyed: Shutting down a Jenkins instance that was still starting up
  3. 3. Hive相关知识点
  4. TCP中RTT的测量和RTO的计算
  5. simple-rpc
  6. Linux下如何创建loop device
  7. springboot做邮件发送功能时报错No qualifying bean of type 'org.springframework.mail.javamail.JavaMailSender' available:的问题解决方案
  8. IDA-hook so层方法与java之间的映射关键
  9. 解决NUC972使用800*480屏幕时,tslib触摸屏校准时,坐标不对称问题
  10. shell脚本快速入门----shell基本语法总结