管程
概念
为了能够深入了解JUC,我们有必要了解一下管程的概念
管程(Moniter监视器):指的是管理共享变量以及对共享变量的操作过程,让它们支持并发。翻译为 Java 就是管理类的成员变量和成员方法,让这个类是线程安全的。
本质就是java中的锁
java中的管程
在JVM中进行同步操作,要基于进入和退出Moniter对象来实现。每个对象都有一个管程对象,随java对象一起创建和销毁
要执行线程操作,要先持有管程对象,然后才能去执行方法,而其他线程就不能在获取这个管程对象,当方法执行完成之后再释放这个管程对象
MESA 模型
MESA 模型是目前实现管程较为常见的模型
在并发领域,有两个核心问题:一个是互斥,一个是同步。管程就是来解决这两个问题的。
- 互斥:同一时刻只允许一个线程访问共享资源。
- 同步:线程之间如何通信、协作。
管程互斥与同步实现
它的思路很简单,将共享变量以及对共享变量的操作统一封装起来。例如,管程 A 将共享变量 data 和相关的操作入队enq、出队deq 封装起来。线程 A 和线程 B想访问共享变量 data ,只能通过调用管程提供的 enq 和 deq 。当然前提是 enq、deq 保证互斥性,只允许一个线程进入管程。是不是很有面向对象的感觉。
在管程模型里,共享变量和对共享变量的操作是被封装起来的,最外层的框就代表封装的意思。框的上面只有一个入口,并且在入口旁边还有一个入口等待队列。当多个线程同时试图进入管程内部时,只允许一个线程进入,其他线程则在入口等待队列中等待。这个过程类似就医流程的分诊,只允许一个患者就诊,其他患者都在门口等待。
管程封装了pv操作,实现了对临界资源的互斥访问,对外提供同步方法入口,同一时间只能有一个线程访问
这就是这篇文章的内容了,欢迎大家的讨论,如有错漏,也请指出,谢谢~