gpt4 book ai didi

java - 在同步块(synchronized block)的 run() 内部使用 this.wait()

转载 作者:行者123 更新时间:2023-11-30 06:05:48 25 4
gpt4 key购买 nike

我有这个代码:

public class Nit extends Thread {
public void run() {
try {
synchronized(this) {
this.wait();
}
System.out.println("AAA");
} catch (InterruptedException e) {
e.printStackTrace();
}
}

public static void main(String[] args) {
Nit n = new Nit();
n.start();
synchronized(n) {
n.notify();
}
}
}

当我从 cmd 运行它时,它永远不会退出,就像它是一个无限循环一样。我不明白为什么。我唯一能想到的是 Nit n 仍在等待,但我不明白为什么?

最佳答案

您正在观察竞争状况。您在等待发生之前通知。因此,等待就坐在那里,永远等待。

如果您足够频繁地调用此代码,有时您可能会看到它通过 - 当新线程比主线程前进得更快时。使示例正常工作的一种方法:尝试添加对 Thread.sleep(1000) 的调用或在调用 notify() 之前。或者,甚至在主线程上调用 println()(在 notify() 之前可能会改变足够的时间)。

除此之外:这些微妙之处是您实际上避免使用“低级”原语(例如等待/通知)的主要原因。相反,您可以使用标准 API 必须提供的强大抽象(如队列)。

关于java - 在同步块(synchronized block)的 run() 内部使用 this.wait(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45676045/

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