什么是管程?

news2024/12/25 15:33:07

前言

在并发编程领域,最核心的两个理念就是同步和互斥,并发编程就是围绕这两个核心概念来完成的。

  • 互斥:同一时刻只能有一个线程持有共享资源
  • 同步:多个线程之间协调、互作
    在最初,人们利用信号量机制来实现互斥和同步,但是对于编程人员来说,在编码中嵌入大量的信号量操作,代码冗余,而且出错概率增大,后来就有了面向开发人员更友好的管程。

管程

回顾信号量机制,三个核心:

  • 共享变量S,来表示共享资源的数量
  • PV操作,这是操作系统的两个原语操作。对共享变量的修改只能通过PV操作来进行。
    • P操作,请求资源,S = S -1
    • V 操作,释放资源, S = S + 1

管程就是将对信号量的操作进行了封装,体现了面向对象的思想。

Monitor,管程,也称作监视器。
管程指的是管理共享变量以及对共享变量操作 的过程,来达到线程安全的目的

简单点说,就是将共享变量和对共享变量的操作 进行了封装,访问共享变量必须通过管程提供的方法来实现,管程保证了同一时刻只允许一个线程操作管程

那么对于上面提到的两个核心互斥和同步,管程是如何实现的呢?

  • 互斥,管程的设计理念就是,同一时刻只能有一个线程操作管程(进入管程)
  • 同步:一个线程进入到管程后,其他线程进入等待队列,等待唤醒;同时管程内部可以存在条件变量,对进入管程的线程进行判断,不满足条件会进入该条件变量的等待队列,最终也会进入统一的等待队列。
    原理图:

以就诊的场景为例,一个医生只能接诊一位病人,未被接诊的病人需要在候诊室等待叫号,此时医生是共享变量(共享资源),一个病人就是一个线程,候诊室就是等待队列,拍CT就是条件变量。

  • 一位病人接诊,此时医生发现病人,病人满足所有的条件,就诊完成,病人离开,去候诊室中的叫下一个号的病人。
  • 如果一位病人接诊后,此时医生发现病人不满足条件,还需要去拍CT,病人离开,下一个病人进来,当这个病人做完CT后,重新在候诊室排队等待被叫号。

总结:
管程对共享变量以及对其的操作进行了封装
管程的组成部分:

  • 共享变量
  • 对共享变量的操作
  • 等待队列
    一个管程可以管理多个共享变量。

同一时刻只允许一个线程进入(访问)管程,并修改共享状态变量S = 1, 此时其他线程检测到共享变量被修改,那么就进入到等待队列
进入到管程内的线程,就可以来操作共享的资源了,管程内可以设置条件变量,同时此条件变量也可以拥有一个自己的等待队列,如果线程不满足条件,此线程退出管程,将此线程加入到此条件等待队列中,当在此队列中出队后,然后重新去竞争管程,失败就加入到等待队列中

在C语言中,管程是一个程序结构代码,在面向对象的语言中,管程是一个对象。
JUC中的AQS就是基于管程来实现的,而JUC中的大部分的锁都是继承AQS来实现的。Java中的synchronized中的监视器锁对象也是基于管程实现的。

参考资料

锁原理 - 信号量 vs 管程:JDK 为什么选择管程 - binarylei - 博客园

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/871785.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多元最短路(Floyd)

是一个基于动态规划的全源最短路算法。它可以高效地求出图上任意两点之间的最短路 时间复杂度 O(n^3) 状态转移方程 f[i][j]min(f[i][j],f[i][k]f[k][j]) 核心代码 void floyd(){for(int k1;k<n;k)for(int i1;i<n;i)for(int j1;j<n;j)s[i][j]min(s[i][j],s[i][k…

使用巴特沃兹滤波器的1D零相位频率滤波研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

使用vscode在vue项目中重命名文件选择了更新导入路径仍有部分导入路径没有更新

背景: 将一个js文件重命名&#xff0c;vscode弹出是否更新导入路径&#xff0c;选择更新导入后&#xff0c;发现js文件中导入路径都自动更新&#xff0c;vue文件中路径都没有更新。 解决方案&#xff1a; 在设置中搜索updateimport&#xff0c;将最下面的Vue>Update Imports…

2023/08/13_____JMM JAVA Memory Model JAVA内存模型

JMM JAVA Memory Model java内存模型 作用&#xff1a;缓存一致性协议&#xff0c;用于定义数据读写的规则&#xff08;遵守&#xff0c;找到这个规则&#xff09; JMM定义了线程2工作内存和主内存之间的抽象关系&#xff1a;线程之间的共享变量存储在主内存&#xff08;main …

(贪心) 剑指 Offer 63. 股票的最大利润 ——【Leetcode每日一题】

❓剑指 Offer 63. 股票的最大利润 难度&#xff1a;中等 假设把某股票的价格按照时间先后顺序存储在数组中&#xff0c;请问买卖该股票一次可能获得的最大利润是多少&#xff1f; 示例 1: 输入: [7,1,5,3,6,4] 输出: 5 解释: 在第 2 天&#xff08;股票价格 1&#xff09;的…

在 Windows 中恢复数据的 5 种方法

发生数据丢失的原因有多种。无论是因为文件被意外删除、文件系统或操作系统损坏&#xff0c;还是由于软件或硬件级别的存储故障&#xff0c;数据都会在您最意想不到的时候丢失。今天我们重点介绍五种数据恢复方法&#xff0c;以应对意外情况的发生。 1.从另一台机器启动硬盘 如…

24近3年内蒙古大学自动化考研院校分析

今天给大家带来的是内蒙古大学控制考研分析 满满干货&#xff5e;还不快快点赞收藏 一、内蒙古大学 学校简介 内蒙古大学位于内蒙古自治区首府、历史文化名城呼和浩特市&#xff0c;距北京400余公里&#xff0c;是中华人民共和国成立后党和国家在民族地区创办的第一所综合大…

阿里云轻量应用服务器使用教程(从购买配置、连接到网站上线)

阿里云轻量应用服务器怎么使用&#xff1f;阿里云百科分享轻量应用服务器从购买、配置建站环境、轻量服务器应用服务器远程连接、开端口到网站上线全流程&#xff1a; 目录 阿里云轻量应用服务器使用教程 步骤一&#xff1a;购买一台轻量应用服务器 步骤二&#xff1a;重置…

深入理解 Vue 3 计算属性:优雅地处理响应式数据计算

计算属性的定义 在 Vue3 的 HTML 模板中是支持 JavaScript 表达式的&#xff0c;例如&#xff1a; <h2>买5个共计&#xff1a;{{ price * 5 }} 元</h2>但是如果当表达式过于复杂时&#xff0c;模板代码就会变得非常臃肿并且可读性就会变差&#xff0c;恰巧&#…

【设计模式——学习笔记】23种设计模式——解释器模式Interpreter(原理讲解+应用场景介绍+案例介绍+Java代码实现)

案例引入 通过解释器模式来实现四则运算&#xff0c;如计算ab-c的值&#xff0c;具体要求 先输入表达式的形式&#xff0c;比如abc-de&#xff0c;要求表达式的字母不能重复在分别输入a,b,c,d,e的值最后求出结果 传统方案 编写一个方法&#xff0c;接收表达式的形式&#xf…

vue中有趣的几个功能

vue中有趣的几个功能 老实说&#xff0c;我们大多数人都不太喜欢阅读文档&#xff0c;但是当使用像 Vue 这样不断发展的现代前端框架时&#xff0c;每个新版本都会发生很多变化&#xff0c;我们可能会错过一些后来推出的新的、闪亮的功能。让我们来看看那些有趣但不那么受欢迎…

【Windows 常用工具系列 5 -- Selenium IDE的使用方法 】

文章目录 Selenium 介绍Selenium IDE 介绍 Selenium IDE安装Chrome 浏览器安装Selenium IDE使用 Selenium 介绍 Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中&#xff0c;就像真正的用户在操作一样。 Selenium家庭成员有三个&#xff0c;分别是S…

并发冲突导致流量放大的线上问题解决

事故现象 生产环境&#xff0c;转账相关请求失败量暴增。 直接原因 现网多个重试请求同时到达 svr&#xff0c;导致内存数据库大量返回时间戳冲突。业务方收到时间戳冲突&#xff0c;自动进行业务重试&#xff0c;服务内部也存在重试&#xff0c;导致流量放大。 转账 首先…

【CI/CD】基于 Jenkins+Docker+Git 的简单 CI 流程实践(上)

基于 JenkinsDockerGit 的简单 CI 流程实践&#xff08;上&#xff09; 在如今的互联网时代&#xff0c;随着软件开发复杂度的不断提高&#xff0c;软件开发和发布管理也越来越重要。目前已经形成一套标准的流程&#xff0c;最重要的组成部分就是 持续集成 及 持续交付、部署。…

用对角线去遍历矩阵

原题链接 用对角线遍历矩阵https://leetcode.cn/leetbook/read/array-and-string/cuxq3/ 算法分析 图一 图二 图三 图四 由上述四个图可以总结得出以下八个结论&#xff1a; 结论1&#xff1a;k属于[0,a(max)b(max)]。 结论2&#xff1a;每一层遍历行最多存在min(m,n)个矩…

深度学习实战基础案例——卷积神经网络(CNN)基于SqueezeNet的眼疾识别|第1例

文章目录 前言一、数据准备1.1 数据集介绍1.2 数据集文件结构 二、项目实战2.1 数据标签划分2.2 数据预处理2.3 构建模型2.4 开始训练2.5 结果可视化 三、数据集个体预测 前言 SqueezeNet是一种轻量且高效的CNN模型&#xff0c;它参数比AlexNet少50倍&#xff0c;但模型性能&a…

4.深入对象

4.1创建对象三种方式 1.利用对象字面量创建对象 const obj{ name : 佩奇 }2.利用new 0bject创建对象 const obj new Object({ name: 佩奇 }) console.log(obj) // {name: 佩奇}3.利用构造函数创建对象 4.2构造函数 构造函数&#xff1a;是一种特殊的函数,主要用来初始化…

hive 中最常用日期处理函数

hive 常用日期处理函数 在工作中&#xff0c;日期函数是提取数据计算数据必须要用到的环节。哪怕是提取某个时间段下的明细数据也得用到日期函数。今天和大家分享一下常用的日期函数。为什么说常用呢&#xff1f;其实这些函数在数据运营同学手上是几乎每天都在使用的。 技术交…

Metasploit教程 - 基本命令

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、metasploit版本二、命令1.help2.msfupdate 命令3.search命令 三.Armitage GUI四&#xff0c;扫描总结 我想我得对我的博客做一些美化&#xff0c;而不是只有…