什么是管程?

管程保证了同一时刻只有一个进程/线程在管程内对共享变量进行操作,其封装了一套对共享资源访问的模型。其作用是保证多进程或者多线程访问同一个资源时,能够达到“互斥”、“同步”的效果。

管程的内部如上图所示。
使用过程如下:

  1. 同步队列的线程去获取管程中共享变量的执行权,如果成功则执行对共享变量的处理。如果失败则返回同步队列。
  2. 对于成功获取到管程执行权的进行对共享变量的处理操作,执行完毕后可以唤醒同步队列的线程,重新竞争锁。也可以进行wait,将线程添加到等待队列中。当其他线程进行notify唤醒操作的时候,等待队列的线程移动到同步队列,重新竞争锁。

管程的实现

管程的实现,其实就是JAVA是通过sychronyzed关键字,和wait()、notify、notifyAll() 方法实现了整个管程模型。执行方式如下

总结

  1. java中synchronized关键字完整实现了管程的模型,因为synchronized锁的是对象,而wait()、notify()、notifyall()是对象的父类Object类中的方法。
  2. 管程在java的内部实现其实是一个monitor监视器,而monitor监视器中的字段(owner、recursions、waitSet、EntryList)就是实现管程的数据结构,只不是monitor将其封装在ObjectMonitor中。
  3. monitor实现的是最简单的,只有一个等待队列。而管程其实可以 设计多个等待队列。

参考

锁原理-管程
java里的管程
Monitor的实现原理

Montior监视器对象与操作系统的管程(monitors)相关推荐

  1. Monitor监视器对象

    在分析完对象头以后,我们知道对象头里其实是有一个重量级锁的指针,而重量级锁的指针指向的就是monitor监视器对象. synchronized无论是修饰代码块还是修饰普通方法和静态方法,本质上还都是作 ...

  2. 【Python】【容器 | 迭代对象 | 迭代器 | 生成器 | 生成器表达式 | 协程 | 期物 | 任务】...

    Python 的 asyncio 类似于 C++ 的 Boost.Asio. 所谓「异步 IO」,就是你发起一个 IO 操作,却不用等它结束,你可以继续做其他事情,当它结束时,你会得到通知. Asyn ...

  3. Java的对象监视器和Condition监视器概念以及对比

    详细介绍了Java对象监视器的概念以及API方法,包括JDK1.5提供的Condition监视器对比. 文章目录 1 对象监视器 1.1 方法 1.2 特点 2 Condition 监视器 2.1 O ...

  4. python3 协程asyncio 调用步骤、阻塞和await、task任务、future对象 partial

    首先介绍一下 偏函数 如果需要减少某个函数的参数个数,你可以使用 functools.partial() [作用一]:partial() 函数允许你给一个或多个参数设置固定的值,减少接下来被调用时的参 ...

  5. OS_process_sync_producercomsumer进程同步/互斥/信号量管程:临界资源/临界区:生产者和消费者问题(缓冲池(缓冲区)问题)

    文章目录 OS_process_sync_producer&comsumer reference 临界资源 (Critical Resouce) 代码的划分 临界区(critical sect ...

  6. python3 asyncio 协程模块

    一直对asyncio这个库比较感兴趣,毕竟这是官网也非常推荐的一个实现高并发的一个模块,python也是在python 3.4中引入了协程的概念.也通过这次整理更加深刻理解这个模块的使用 asynci ...

  7. java对象的内存结构_JAVA 对象内存结构

    JAVA对象内存结构 HotSpot虚拟机中,对象在内存中存储的布局可以分为三块区域:对象头(Header).实例数据(Instance Data)和对齐填充(Padding). 对象头 markWo ...

  8. Java面试宝典系列之基础面试题String、变量、类与对象、集合类、SSH(二)

    作者:egg 邮箱:xtfggef@gmail.com 微博:http://weibo.com/xtfggef 博客:http://blog.csdn.net/zhangerqing(转载请说明出处) ...

  9. 多个线程访问统一对象的不同方法_不会多线程还想进BAT?精选19道多线程面试题,有答案边看边学...

    一. Java程序如何停止一个线程? 建议使用"异常法"来终止线程的继续运行.在想要被中断执行的线程中, 调用 interrupted()方法,该方法用来检验当前线程是否已经被中断 ...

  10. 垃圾回收之如何判断对象可以回收、四种引用以及实际案例操作

    垃圾回收 JVM内存结构中的堆存在垃圾回收机制,我们接下来就来详细地学习一下垃圾回收的相关知识. 1. 如何判断对象可以回收 1.1 引用计数法 只要一个对象被其他变量所引用,那就让这个对象的计数+1 ...

最新文章

  1. python使用字典格式化字符串-4.2.3Python下字典的格式化字符串
  2. centos 对已有卷扩容_CentOS LVM 新加硬盘,扩容逻辑卷步骤
  3. Confluence 6 升级完成后的检查
  4. Web技术电子期刊2008年第3期(总第23期)
  5. Hadoop0.20.2版本在Ubuntu下安装和配置
  6. greenplum 存储过程_揭秘!Greenplum并行执行引擎到底是如何工作的?
  7. haproxy 负载_负载测试HAProxy(第1部分)
  8. QT5开发及实例学习之十Qt5主窗口构成
  9. Docker学习文档之三 其他相关-生产环境
  10. System.DllNotFoundException: 无法加载 DLL“GdltaxIA.dll”: 内存位置访问无效。 (异常来自 HRESULT:0x800703E6)。 WIN7系统
  11. 2022.01.24翻译Lorry
  12. Learn Git Branching 答案
  13. css之让尾部永远固定在页面最下方
  14. mount时发生错误:wrong fs type, bad option, bad superblock on
  15. java对数据加解密_java 使用AES对数据进行加密和解密
  16. 扦插技术图解_桂花的扦插方法(图解)
  17. Excel 2016新增图表攻略
  18. Policy Gradient 之 A3C 与 A2C 算法
  19. java架构师的自我修养是什么
  20. AcWing数学知识

热门文章

  1. jQuery.extend( object ); 扩展jQuery对象本身
  2. a系统给b系统转100块钱,如如何实现?
  3. Qt生成不重复的随机数
  4. 35岁的程序员:第33章,转正
  5. 智慧档案馆十防一体化建设一些主要设计依据
  6. 乐高Studio打开Solidworks零件/装配体 (sw另存obj文件)
  7. [请教] 关于把mscomm控件封装进dll的
  8. 疫情让我使用V-rep仿真(结合pythonAPI)实现机器人视觉巡线+pid调速,
  9. 【渝粤题库】国家开放大学2021春3930事故管理与应急处置题目
  10. 作为文科生,如何才能学好一门编程语言?