gpt4 book ai didi

java - wait 方法唤醒而不调用 notify(NOT SPURIOUS WAKEUP)

转载 作者:搜寻专家 更新时间:2023-11-01 02:37:32 26 4
gpt4 key购买 nike

在下面的语句中,即使没有调用通知,wait() 方法也会执行,但是 below() 语句仅在 laurel 之后执行 线程完成它的执行。

我尝试使用其他对象来锁定 hardy block 的同步,这次 wait 方法仍在永远等待,有人能解释一下为什么执行 wait() 之后的语句吗?

package delagation;

public class Solution extends Thread {

static Thread laurel, hardy;

public static void main(String[] args) throws InterruptedException {
laurel = new Thread() {
public void run() {
System.out.println("A");
try {
hardy.sleep(1000);
} catch (Exception e) {
System.out.println("B");
}
System.out.println("C");
}
};
hardy = new Thread() {
public void run() {
System.out.println("D");
try {
synchronized(laurel) {
laurel.wait();
//wait method is called here,
//There is not notify in this class,
//but the statement below are executing
System.out.println(Thread.currentThread().getName());
}
} catch (Exception e) {
System.out.println("E");
}
System.out.println("F");
}
};
laurel.setName("laurel");
hardy.setName("hardy");
laurel.start();
hardy.start();
}
}

最佳答案

您不需要假定虚假唤醒来解释这里发生的事情。当 laurel 终止时,它会向等待它的线程发送一个 notifyAll。 (这就是 Thread.join 的工作原理。)

请参阅 Thread#join 的 api 文档:

This implementation uses a loop of this.wait calls conditioned on this.isAlive. As a thread terminates the this.notifyAll method is invoked. It is recommended that applications not use wait, notify, or notifyAll on Thread instances.

此外,总是在一个循环中等待,使用一个条件;请参阅 Oracle 并发教程,尤其是 Guarded Blocks 页面。 (从描述中你可以看到 join 在一个循环中等待,在这个循环中测试的条件是 isAlive 在加入的线程上,所以这是一个很好的例子。你可以在 Thread 类的 jdk 源代码中找到 join 方法。)

关于java - wait 方法唤醒而不调用 notify(NOT SPURIOUS WAKEUP),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44076490/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com