为何以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,提问作者自东土大唐而来
相关产品推荐
相关产品推荐

