Java synchronized 中监视器 Monitor 是什么
monitor(监视器)是 java 虚拟机实现对象锁的底层机制,它本质上是一个互斥量加上一组条件变量的集合。在 hotspot jvm 中,每个对象头都包含一个指向 objectmonitor 结构的指针,当线程尝试获取锁时,会操作该结构中的 _owner、_count 和 _waitset 等字段来完成同步。

ObjectMonitor 的核心状态与线程流转
当一个线程进入 synchronized 块时,JVM 会通过 CAS 操作将当前线程 ID 写入 ObjectMonitor 的 _owner 字段;如果成功,则 _count 加一。若此时有其他线程竞争,它们会被挂起并放入 _WaitSet 或 _EntryList 队列中等待唤醒。

public class MonitorDemo {
private final Object monitor = new Object();
public void synchronizedMethod() {
// 这里隐式获取 monitor 对象的 ObjectMonitor
synchronized (monitor) {
System.out.println("Thread " + Thread.currentThread().getName() + " acquired lock");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
MonitorDemo demo = new MonitorDemo();
Thread t1 = new Thread(demo::synchronizedMethod, "T1");
Thread t2 = new Thread(demo::synchronizedMethod, "T2");
t1.start();
t2.start();
}
}wait/notify 如何影响 Monitor 内部队列
在 Monitor 内部,调用 wait() 会使当前线程从 _owner 状态转移到 _WaitSet 集合中,并释放锁计数。而 notify() 会从 _WaitSet 中取出一个线程移动到 _EntryList 中,使其重新参与锁的竞争。这种机制确保了线程间的协作有序进行。
立即学习“Java免费学习笔记(深入)”;

public class WaitNotifyDemo {
private final Object monitor = new Object();
private boolean ready = false;
public void producer() {
synchronized (monitor) {
ready = true;
monitor.notify(); // 唤醒消费者
}
}
public void consumer() throws InterruptedException {
synchronized (monitor) {
while (!ready) {
monitor.wait(); // 释放锁并进入 WaitSet
}
System.out.println("Consumed!");
}
}
}


















