gpt4 book ai didi

java - 为什么会抛出 IllegalMonitorStateException?

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

我正在研究 Java 多线程。我非常熟悉 C/C++ pthreads,但在使用 Java notify()wait() 函数时遇到问题。

我知道 IllegalMoinitorStateException 仅在不“拥有”(也称为未同步)的线程调用通知/等待时抛出。

在编写我的应用程序时,我遇到了这个问题。我用以下测试代码隔离了问题:

public class HelloWorld
{
public static Integer notifier = 0;
public static void main(String[] args){
notifier = 100;
Thread thread = new Thread(new Runnable(){
public void run(){
synchronized (notifier){
System.out.println("Notifier is: " + notifier + " waiting");
try{
notifier.wait();
System.out.println("Awake, notifier is " + notifier);
}
catch (InterruptedException e){e.printStackTrace();}
}
}});
thread.start();
try{
Thread.sleep(1000);
}
catch (InterruptedException e){
e.printStackTrace();
}
synchronized (notifier){
notifier = 50;
System.out.println("Notifier is: " + notifier + " notifying");
notifier.notify();
}
}
}

这个输出:

    Exception in thread "main" java.lang.IllegalMonitorStateException
at java.lang.Object.notify(Native Method)
at HelloWorld.main(HelloWorld.java:27)

我相信我已经获得了对通知对象的锁定。我做错了什么?

谢谢!

编辑:

从这个可能的副本(Synchronizing on an Integer value)看来,在整数上同步似乎不是一个好主意,因为很难确保您在同一个实例上同步。由于我正在同步的整数是一个全局可见的静态整数,为什么我得到不同的实例?

最佳答案

因为 notifier = 50; 你在不同的对象上调用 notifier.notify();

关于java - 为什么会抛出 IllegalMonitorStateException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15591084/

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