Monitor机制
monitor概要
Java 语言实现 monitor 机制,属于编译器的工作。
monitor机制需要3个元素配合使用,分别是:
- 临界区
- monitor 对象及锁
- 条件变量以及定义在 monitor 对象上的 wait,signal 操作
使用monitor机制让互斥进入临界区,用monitor 对象来保存被阻塞的线程,由于 monitor 机制本质上是基于 mutex 这种基本原语的,所以 monitor object 还必须维护一个基于 mutex 的锁。而条件变量的引入是为了能够在适当的时候阻塞和唤醒 进程/线程,由这个条件变量来确定什么时候是“适当的时候”。条件变量的定义有很大的自主性
monitor实现
monitor是操作系统提出的一种高级原语。monitor在java的具体实现是依靠synchronized 关键字来修饰实例方法、类方法以及代码块,被 synchronized 关键字修饰的方法、代码块,就是 monitor 机制的临界区。
synchronized关联的对象就是 monitor object。monitor object 充当着维护 mutex以及定义 wait/signal API 来管理线程的阻塞和唤醒的角色。
java.lang.Object 类定义了 wait(),notify(),notifyAll() 方法,这些方法的具体实现,依赖于一个叫 ObjectMonitor 模式的实现,这是 JVM 内部基于 C++ 实现的一套机制。
当一个线程要获取object的锁时,会进入EntrySet中进行等待,如果线程获得了锁,成为了锁的owner后。当程序逻辑中,不满足条件时而无法继续执行下去时(例如生产者发现队列已满或者消费者发现队列为空),该线程可以通过调用 wait 方法将锁释放,进入 wait set 中阻塞进行等待,其它线程在这个时候有机会获得锁,,去干其它的事情,从而使得之前不满足的外部条件成立,这样先前被阻塞的线程就可以重新进入 EntrySet 去竞争锁。