管程(Moniter): 并发编程的基本心法( 三 )
enq
和 deq
。 当然前提是 enq
、deq
保证互斥性 , 只允许一个线程进入管程 。 是不是很有面向对象的感觉 。
在管程模型里 , 共享变量和对共享变量的操作是被封装起来的 , 图中最外层的框就代表封装的意思 。 框的上面只有一个入口 , 并且在入口旁边还有一个入口等待队列 。 当多个线程同时试图进入管程内部时 , 只允许一个线程进入 , 其他线程则在入口等待队列中等待 。 这个过程类似就医流程的分诊 , 只允许一个患者就诊 , 其他患者都在门口等待 。
管程里还引入了条件变量的概念 , 而且每个条件变量都对应有一个等待队列 , 如下图 , 条件变量 A 和条件变量 B 分别都有自己的等待队列 。
通过条件通知去唤醒等待队列的线程竞争 锁资源 。
我们通过一段代码说明 , 实现一个阻塞队列 , 队列分别有出队与入队 , 都是要先获取互斥锁 , 就像管程中的入口 。
推荐阅读
- 手机游戏|LOL手游女主播遭遇网暴,停播一周并发文求饶,长得漂亮有错吗?
- 华为|华为“后遗症”并发?谁也没想到,深埋7年“地雷”被英国引爆?
- 并发经验八年架构师:带你轻松解决缓存在高并发场景下的问题
- 2020最新500道Java高岗面试题:数据库+微服务 +SSM+并发编程+..
- 疫情过后,Java开发者如何应对多线程与高并发面试题目?提高自身竞争力
- Java多线程与并发之ThreadLocal
- BAT一线互联网常考面试题:Spring+并发编程+JVM+设计模式+Redis
- 微软宣布在2030年实现碳负排放,并发布计划时间表
- Java架构-高并发的解决方案
- 高并发服务器架构--SEDA架构分析