Monitor(管程/监视器)详解
说明
Monitor,直译为“监视器”,而操作系统领域一般翻译为“管程”。管程是指管理共享变量以及对共享变量操作的过程,让它们支持并发。在Java 1.5之前,Java语言提供的唯一并发语言就是管程,Java 1.5之后提供的SDK并发包也是以管程为基础的。除了Java之外,C/C++、C#等高级语言也都是支持管程的。synchronized关键字和wait()、notify()、notifyAll()这三个方法是Java中实现管程技术的组成部分。
MESA模型分析
在管程的发展史上,先后出现过三种不同的管程模型,分别是Hasen模型、Hoare模型和 MESA模型。现在正在广泛使用的是MESA模型。下面我们便介绍MESA模型:
管程中引入了条件变量的概念,而且每个条件变量都对应有一个等待队列。条件变量和等待 队列的作用是解决线程之间的同步问题。
分析作用:
入口等待队列:试图要获取锁的线程都必须要进入到这个队列,只有在这个队列里面才能获取锁,而且每次都是获取到锁才会出队。
条件变量等待队列:这个是为已获得锁的成员进入等待阻塞准备的,当需要等待条件满足时,为了更好的利用CPU,让线程进入等待阻塞,而什么时候再次获得锁,也就是当等待的条件满足了,就会从这个队列中出去,进入到入口等待队列中,再次获取锁。
wait()的正确使用姿势
对于MESA管程来说,有一个编程范式:
while(条件不满足) { wait(); }