博客
关于我
Java并发编程--08 | 管程:并发编程的万能钥匙
阅读量:552 次
发布时间:2019-03-09

本文共 1074 字,大约阅读时间需要 3 分钟。

管程(Monitor)是一种核心概念,在编程中找到其对应的认知至关重要。任何语言都可以通过管程实现相互独立线程的同步与协调。

在Java编程语言中,每当调用 synchronized 关键字修饰的方法时,会为该方法所在的对象自动绑定一个管程(即监视器)。需要注意的是,该管程的生命周期完全由Neobic的对象生命周期管理。

当线程尝试访问加锁对象(即需要 synchronized 修饰的方法所在的对象),它实际上正在尝试获取该对象的管程。这种行为就像病人需要到门诊室就诊一样。而门诊室内的资源则为共享资源。这时门诊室相当于管程的作用,而锁定资源则是指医生本身。病人进入门诊室,就是在线程进入了该管程的过程。

根据Java规范,任何线程想要共同访问一次为共享资源的对象,必须具备相应的管程进入许可。这就好似所有病人要想进入同一个门诊室,都需要先通过门诊室的门卫驻足,在获得批准的情况下才能进入门诊室。门卫就相当于管程的作用,而门诊室的入口相当于共享资源的保护层。

管程在实现上至少需要提供两个等待队列。第一个负责线程进入管程时等待进入,而第二个则用于处理条件变量相关的等待。在实际应用中,第二个等待队列通常与特定条件相关联。例如,当线程获取了管程进入许可后,对某个 synchronizedFetching 条件变量进行操作时,若该条件在操作时无法及时达成,就需要回到第二个等待队列中等待,直到接收到某个条件信号(事件)后才重新尝试进入管程。这就类似于:某一病人在诊断过程中需要进行心电图检查,但心电图机器有自己的等待室,需要病人到达该等待室排队。另一个病人则可能需要进行胸部X光检查,这时X光机也需要另一个等待室来接收患者。

通常情况下,当线程在处理管程内的部分操作时,若该线程无法及时满足条件,就只能释放管程,回归到第二个等待队列中等待。待接收到相关的条件信号后,它才能重新请求管程进入许可,从而获得进入管程的机会。这样的行为模式具很强的灵活性和可扩展性。具体而言,这与病人在诊断过程中根据具体需求进入不同的检查室的情况类似,即使后来诊断结果显示需要进一步检查,这位病人也要重新回到门诊室重新抽签,待轮到的到他才能进一步接受治疗。

总之,管程就是用于管理共享资源的对象行为管理机制。任何试图访问此类共享资源的线程,都需要通过相应的管程机制进行等待和进入,确保调度的正确性和资源的安全性。这与现实生活中的门诊室门锁和门卫机制相呼应,两者共同确保了特定资源的有限性和顺序性,让不同的线程能够有序地访问共享资源。进而避免了无序的竞争和潜在的死锁问题。

转载地址:http://glqsz.baihongyu.com/

你可能感兴趣的文章
Nginx-http-flv-module流媒体服务器搭建+模拟推流+flv.js在前端html和Vue中播放HTTP-FLV视频流
查看>>
nginx-vts + prometheus 监控nginx
查看>>
Nginx下配置codeigniter框架方法
查看>>
Nginx之二:nginx.conf简单配置(参数详解)
查看>>
Nginx代理websocket配置(解决websocket异常断开连接tcp连接不断问题)
查看>>
Nginx代理初探
查看>>
nginx代理地图服务--离线部署地图服务(地图数据篇.4)
查看>>
Nginx代理外网映射
查看>>
Nginx代理模式下 log-format 获取客户端真实IP
查看>>
Nginx代理静态资源(gis瓦片图片)实现非固定ip的url适配网络环境映射ip下的资源请求解决方案
查看>>
Nginx代理静态资源(gis瓦片图片)实现非固定ip的url适配网络环境映射ip下的资源请求解决方案
查看>>
Nginx反向代理与正向代理配置
查看>>
Nginx反向代理是什么意思?如何配置Nginx反向代理?
查看>>
nginx反向代理解决跨域问题,使本地调试更方便
查看>>
nginx启动脚本
查看>>
Nginx在Windows下载安装启动与配置前后端请求代理
查看>>
Nginx多域名,多证书,多服务配置,实用版
查看>>
nginx开机启动脚本
查看>>
nginx异常:the “ssl“ parameter requires ngx_http_ssl_module in /usr/local/nginx/conf
查看>>
nginx总结及使用Docker创建nginx教程
查看>>