Java 同步时引发IllegalMonitorStateException
我正在学习java中的多线程。现在我要打印123123。。。从三个不同的线程。我知道存在其他解决方案,但我需要了解引发异常的原因。。 根据oracle文档,当在不拥有监视器的情况下调用wait或notify时,会抛出该命令。 我想知道同步是否在主对象上,为什么它不被拥有。 这是我的密码Java 同步时引发IllegalMonitorStateException,java,concurrency,Java,Concurrency,我正在学习java中的多线程。现在我要打印123123。。。从三个不同的线程。我知道存在其他解决方案,但我需要了解引发异常的原因。。 根据oracle文档,当在不拥有监视器的情况下调用wait或notify时,会抛出该命令。 我想知道同步是否在主对象上,为什么它不被拥有。 这是我的密码 class ThreadA implements Runnable { Main main; Object o = new Object(); ThreadA(Main m) {
class ThreadA implements Runnable {
Main main;
Object o = new Object();
ThreadA(Main m) {
this.main = m;
}
@Override
public void run() {
synchronized (main) {
while (main.val == 1) {
System.out.println(Thread.currentThread().getName());
main.val = 2;
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
notifyAll();
}
}
}
class ThreadB implements Runnable {
Main main;
Object o = new Object();
ThreadB(Main m) {
this.main = m;
}
@Override
public void run() {
synchronized (main) {
while (main.val == 2) {
System.out.println(Thread.currentThread().getName());
main.val = 3;
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
notifyAll();
}
}
}
class ThreadC implements Runnable {
Main main;
Object o = new Object();
ThreadC(Main m) {
this.main = m;
}
@Override
public void run() {
synchronized (main) {
while (main.val == 3) {
System.out.println(Thread.currentThread().getName());
main.val = 1;
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
notifyAll();
}
}
}
public class Main {
volatile static int val = 1;
public static void main(String[] args) {
Main m = new Main();
Thread A = new Thread(new ThreadA(m), "TA");
Thread B = new Thread(new ThreadB(m), "TB");
Thread C = new Thread(new ThreadC(m), "TC");
A.start();
B.start();
C.start();
}
}
我找到了解决办法。它应该是main.wait()和main.notify()将线程的
run()
方法的整个主体放在synchronized
语句中几乎从来都不是一个好主意。