非常不错 满一行 老师靠谱

Thread.Join()原理【保护性暂停模式】

  1. public final synchronized void join(long millis)
  2. throws InterruptedException {
  3. long base = System.currentTimeMillis();
  4. long now = 0;
  5. if (millis < 0) {
  6. throw new IllegalArgumentException("timeout value is negative");
  7. }
  8. if (millis == 0) {
  9. while (isAlive()) {
  10. //这里的wait()是Object.wait()
  11. wait(0);
  12. }
  13. } else {
  14. while (isAlive()) {
  15. long delay = millis - now;
  16. if (delay <= 0) {
  17. break;
  18. }
  19. wait(delay);
  20. now = System.currentTimeMillis() - base;
  21. }
  22. }
  23. }

外部线程例如main线程调用thread.join()

  • isAlive():是判断thread(this)是否alive
  • wait():是Object.wait(),是方法调用线程(main线程wait()【wait必须放在synchronized中,此时main线程持有thread对象作为锁】
  • 调用了wait()方法,那么notify()或者notifyAll()方法是在哪儿被调用的?答:线程执行完后jvm会调用notifyAll()方法
  • 为了防止虚假唤醒,要记录时间base,计算出虚假唤醒后需要wait的时间

    Thread.join()源码分析

两阶段终止模式【优雅退出】

image.png

balking模式【用来防止线程重复启动】

image.png

单利模式为什么要volatile

image.png
INSTANCE 用volatile修饰即可以解决。
写屏障,读屏障 保证顺序执行