Thread.Join()原理【保护性暂停模式】
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()是Object.wait()
wait(0);
}
} else {
while (isAlive()) {
long delay = millis - now;
if (delay <= 0) {
break;
}
wait(delay);
now = System.currentTimeMillis() - base;
}
}
}
外部线程例如main线程调用thread.join()
- isAlive():是判断thread(this)是否alive
- wait():是Object.wait(),是方法调用线程(main线程)wait()【wait必须放在synchronized中,此时main线程持有thread对象作为锁】
- 调用了wait()方法,那么notify()或者notifyAll()方法是在哪儿被调用的?答:线程执行完后jvm会调用notifyAll()方法
- 为了防止虚假唤醒,要记录时间base,计算出虚假唤醒后需要wait的时间
两阶段终止模式【优雅退出】
balking模式【用来防止线程重复启动】
单利模式为什么要volatile
INSTANCE 用volatile修饰即可以解决。
写屏障,读屏障 保证顺序执行