gpt4 book ai didi

java - 在 Integer 上同步时 notify() 出现 IllegalMonitorStateException

转载 作者:行者123 更新时间:2023-11-29 06:33:44 24 4
gpt4 key购买 nike

我刚开始在 Java 中使用 wait() 和 notify(),我遇到了 IllegalMonitorStateException。

主要代码

public class ThreadTest {

private static Integer state = 0;
public static void main(String[] args) {

synchronized(state) {
System.out.println("Starting thread");

Thread t = new Thread(new AnotherTest());
t.start();

synchronized(state) {
state = 0;
while(state == 0) {
try {
state.wait(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("State is: " + state);
}
}
}

public static class AnotherTest implements Runnable {

@Override
public void run() {
synchronized(state) {
state = 1;
state.notify();
}

}

}
}

我收到一个 IllegalMonitorStateException,调用的是 state.notify()。有什么想法吗?

编辑:根据下面的答案,这里是有效的代码。作为旁注,我首先尝试使用一个枚举,它与使用 Integer 有同样的问题。

public class ThreadTest {

private static int state = 0;
private static Object monitor = new Object();
public static void main(String[] args) {

synchronized(monitor) {
System.out.println("Starting thread");

Thread t = new Thread(new AnotherTest());
t.start();

state = 0;
while(state == 0) {
try {
for(int i = 0; i < 5; i++) {
System.out.println("Waiting " + (5 - i) + " Seconds");
Thread.sleep(1000);
}
monitor.wait(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("State is: " + state);
}
}

public static class AnotherTest implements Runnable {

@Override
public void run() {
synchronized(monitor) {
state = 1;
monitor.notify();
}

}

}
}

最佳答案

这个

private static Integer state = 0;

相当于

private static Integer state = Integer.valueOf(0);

valueOf(0) 的调用返回对Integer 对象的引用,称之为 A。

然后你做

synchronized(state) {

你的线程获取了state引用的对象的锁,当前是A。

然后你做

state = 1;

相当于

state = Integer.valueOf(1);

它为您提供了对 Integer 对象的不同引用,将其称为 B,并将其分配给 state。当您随后调用

state.notify();

您正在对象 B 上调用 notify(),您的线程不拥有该对象的监视器。您不能对线程不拥有监视器的对象调用 notifywait

关于java - 在 Integer 上同步时 notify() 出现 IllegalMonitorStateException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25733718/

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