一,monitor 原理
monitor 直译过来是监视器的意思,专业一点叫管程。monitor 是属于编程语言级别的,它的出现是为了解决操作系统级别关于线程同步原语的使用复杂性,类似于语法糖,对复杂操作进行封装。而 java 则基于 monitor 机制实现了它自己的线程同步机制,就是 synchronized 内置锁。
Java 对象存储在内存中,分别分为三个部分,即对象头、实例数据和对齐填充,而在其对象头中,保存了锁标识;同时,java.lang.Object 类定义了 wait(),notify(),notifyAll() 方法,这些方法的具体实现,依赖于一个叫 Monitor 模式的实现,这是 JVM 内部基于 C++ 实现的一套机制,基本原理如下所示:
Owner
:存放持有锁的线程;EntryList
:存放等待竞争 Object 锁的线程,当 Owner 释放锁,则去竞争锁。(先进后出,后进来的线程先获得锁)WaitSet
:当调用 wait 方法时,线程被放入 WaitSet 中。当 notify 唤醒该线程时,重新进入 EntryList,等待竞争锁。
文章参考
二,wait/notify 原理
wait/notify 是基于 monitor 实现,当调用 wait 方法时,线程进入 WaitSet 中;当被 notify 唤醒时,线程重新进入 EntryList,等待竞争锁。
三,join 原理
t1.join() 是 Thread 类的一个方法,join() 方法阻塞调用者线程,调用者线程进入 t1 的 waitSet 等待,直到 t1 运行结束,调用者线程再继续。
public final synchronized void join(long millis)
throws InterruptedException {
long base = System.currentTimeMillis();
long now = 0;
if (millis < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
if (millis == 0) {
while (isAlive()) {
wait(0);
}
} else {
while (isAlive()) {
long delay = millis - now;
if (delay <= 0) {
break;
}
wait(delay);
now = System.currentTimeMillis() - base;
}
}
}
评论区