侧边栏壁纸
博主头像
再见理想博主等级

只争朝夕,不负韶华

  • 累计撰写 112 篇文章
  • 累计创建 64 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

wait notify和join原理浅析

再见理想
2022-05-29 / 0 评论 / 0 点赞 / 330 阅读 / 505 字

一,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原理的讨论

二,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;
            }
        }
    }
0

评论区