【发布时间】:2026-01-09 12:20:05
【问题描述】:
我发现了 java 并发的奇怪行为。请参阅下面的下一个代码:
公共类测试{ 静态 CountDownLatch 锁存器 = 新的 CountDownLatch(1); public static void main(String[] args) 抛出 UnsupportedEncodingException, InterruptedException { 最终线程 t = new MyThread(); t.start(); 同步(t){ 锁存器.countDown(); System.out.println("要睡觉了"); t.wait(); System.out.println("唤醒"); } } 静态类 MyThread 扩展 Thread { @覆盖 公共无效运行(){ 尝试 { 锁存器.await(); } 捕捉(InterruptedException e){ e.printStackTrace(); } 同步(这个){ System.out.println("内部运行"); // notifyAll(); } } } }在我看来,这段代码应该挂断并永远等待,但是代码已经完成,控制台中的 next out 没有任何问题:
睡觉了 内跑 醒来我试图找到一些关于在线程死亡时通知锁的信息,但缺少它。 我也没有在 java 规范中找到任何信息。
但是,如果我尝试锁定其他对象(而不是线程对象),它可以正常工作。
【问题讨论】:
-
你锁定线程实例上的同步,运行线程,然后在 Main 中等待线程。在这一点上,线程应该有统治权。它在 this 上同步,这与 Main 等待的相同,然后调用 notifyAll(),它释放 Main 中的等待。该应用程序应该可以正常运行。
-
另外,not 在线程上调用 wait/notify/notifyAll - 它在内部使用它。哦,更喜欢实现 Runnable 而不是扩展 Thread :)
-
为什么 notifyAll() 被注释掉了?如果它处于活动状态,那么我也希望代码不会挂断。
标签: java multithreading concurrency