gpt4 book ai didi

java - 同步块(synchronized block)内的 IllegalMonitorStateException

转载 作者:行者123 更新时间:2023-11-29 07:04:52 25 4
gpt4 key购买 nike

虽然我在同步块(synchronized block)中写了等待。我收到 IllegalMonitorStateException。那是什么原因呢?

package trials;

public class WaitNotifyTrial {

public static void main(String[] args){
Generator g=new Generator();
g.start();
System.out.println("Start");
synchronized (g) {
try {
g.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
System.out.println("Printing exception");
e.printStackTrace();
}
System.out.println(g.value);
}
}
}

class Generator extends Thread{

int value;

public void run(){
synchronized (this) {
value=10;
}
notify();
}
}
}

最佳答案

这些是您的代码的一些问题:

  • 您在 synchronized (this) 之外调用了 notify()(这是您的直接问题);
  • 您没有使用正确的等待循环习惯用法,因此在面对虚假唤醒错过通知;
  • 您在 Thread 实例上使用了 wait-notify 机制,即 recommended against in its documentation ;
  • 您扩展 Thread,而不是按原样使用该类,只将您的 Runnable 实现实例传递给它。

近十年来,一般的建议是完全避免 wait-notify 机制,而是使用 java.util.concurrent 中的一种同步辅助工具,例如 CountDownLatch

关于java - 同步块(synchronized block)内的 IllegalMonitorStateException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20870299/

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