You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何以Thread对象为锁时,未调用notify()主线程仍能从wait()唤醒?

问题分析:未调用notify()主线程仍从wait()唤醒的原因

先看你提供的代码:

public class WaitMain {
    public volatile static int i = 0;

    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(){
            public void run(){
                for (i = 0; i < 1000000; i++);
            }
        };

        t1.start();
        synchronized (t1){
            t1.wait();
        }

        System.out.println(i);
    }
}

你疑惑的点是:明明没调用notify()或notifyAll(),主线程却能从wait()状态唤醒并执行后续代码。

核心原因

这是Java线程的终止通知机制在起作用:当一个线程(这里是t1)的run()方法执行完毕、生命周期结束时,JVM会自动调用该线程对象的notifyAll()方法,唤醒所有等待在这个线程对象监视器上的线程。

具体到你的代码流程:

  • 主线程启动t1,然后进入synchronized (t1)块,获取t1对象的锁,接着调用t1.wait()释放锁并进入等待状态。
  • t1线程执行完for循环后,run()方法结束,线程终止。此时JVM会自动触发t1对象的notifyAll()。
  • 主线程收到这个通知,重新获取t1的锁后,从wait()方法返回,继续执行后续的System.out.println(i)。

补充说明

这个机制是Java规范里明确规定的,目的是避免等待线程因为目标线程终止而永久阻塞。你可以理解为:线程对象本身就内置了这种"终止时通知等待者"的逻辑,不需要手动调用notify。

内容的提问来源于stack exchange,提问作者自东土大唐而来

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 04:12:41