当前位置: 首页 > news >正文

AQS

管程

一般要实现多线程同步有两种解决方案,分别是信号量和管程原语,信号量通过PV操作可以很方便的实现线程间的互斥操作,如果拿到信号量的许可后才能执行线程处理,但是信号量使用有个弊端就是在业务代码中有大量的PV方法要编写,如果在某个地方处理了P但是没有使用V进行释放,那么其他线程就会阻塞无法执行下去。并且信号量是最底层的原语,只能实现计数PV操作。
而管程的话经过高层模块的抽象,互斥、条件等待、共享数据都封装在了一起,线程只能通过管程模块来实现并发操作,使得线程使用更安全高效。
管程的经典实现模型MESA模型如下图所示
image
它分为以下几个模块:

  • 共享变量: 用于标识锁是空闲状态还是被占用的状态
  • 条件变量:用于标识条件是否满足,如果满足唤醒线程继续执行。
  • 方法: 管程中封装的方法,例如加锁,解锁这种。
  • 条件等待队列: 当线程不满足条件挂起时,会休眠并将线程存储到等待队列中。
  • 入口等待队列: 当多个线程竞争同一把锁会只有一个线程拿到锁,其他未拿到锁的线程会进入入库等待队列中。
    MESA的执行流程和我们之前的使用ReentrantLock实现的消费者生产者的例子一样,首先主线程执行方法会尝试获取锁,如果锁未获取到则会进入等待队列中,等待线程执行完成后从等待队列中获取一个线程继续执行。之后如果线程拿到锁之后会修改共享变量状态为已占用状态,避免其他线程再次获取到锁。之后这两个条件变量就像我们创建的providerCondition和consumerCondition的Condition一样,执行await()方法线程就会阻塞并添加到等待队列中,执行signalAll()方法就会从条件队列中唤醒线程继续执行。当线程执行完成后会修改共享变量为未占用。方法A和方法B就像ReentrantLock的管程方法unlock和lock。
    这些模块的实现Java内部也封装好了:
  • 共享变量可以使用CAS保证原子性
  • 等待队列可以使用CLH队列
  • object.notify和wait方法只能唤醒和锁关联的随机变量,这是不符合要求的,我们的要求是从队列中获取一个线程进行唤醒,使用LockSupport的park和unpark可以唤醒或等待指定线程。
http://www.rkmt.cn/news/2275.html

相关文章:

  • 一、CPU的功能和基本结构
  • 一个简单美观的文件时间修改器
  • 暗黑类游戏属性系统程序设计思路3.0
  • 完整教程:毕设课题:基于Node.js+Express框架+Mysql数据库的助农农产品销售商城设计与实现
  • 经典的混合加密传输协议—PGP
  • cache redis
  • Java的基本数据类型
  • H5游戏性能优化系列-----配置相关优化
  • Codeforces Round 1049 (Div. 2) E
  • 批量设置Excel样式格式(如:纸张大小,排版,字体等)+ 支持windows系统
  • 张瑜:牛市进程之十大观察指标 - Leone
  • Windows 11 系统优化
  • 碎碎念(十六)
  • RK3588+xenomai3+ethercat搭建
  • 【已解决】git push 问题 send-pack: unexpected disconnect while reading sideband packet
  • Adobe Lightroom Classic 2023 中文破解版:摄影师必备的 RAW 图像处理神器(附安装指南)
  • start.bat
  • 外泌体适配体筛选的 SELEX 技术:5 大核心方法拆解,精准捕捉 “细胞信使”
  • 知识点 AlexNet(2/8)
  • QtCreator问题输出框 MSVC编译出现中文乱码报错
  • Gitee DevOps本土化实践:为中国开发者打造全流程效能引擎
  • macbook pro2012怎么安装windows系统
  • Cloud Foundation Kit启动预加载,赋能喜马拉雅秒启秒开流畅体验
  • 领嵌iLeadE-588网关全新一代Alot高端应用芯片支持二次开发
  • Gitee Wiki:重塑关键领域软件研发的知识管理新范式
  • 解决 windows远程桌面报错“CredSSP加密数据库修正”
  • 【科普系列】隐藏在OSI模型里的“交通指挥员”——UDS会话层
  • H5游戏性能优化系列-----总纲
  • 阿里云边缘安全加速ESA保障服务安全
  • rancher服务启动失败