Java 同步时引发IllegalMonitorStateException

Java 同步时引发IllegalMonitorStateException,java,concurrency,Java,Concurrency,我正在学习java中的多线程。现在我要打印123123。。。从三个不同的线程。我知道存在其他解决方案,但我需要了解引发异常的原因。。 根据oracle文档,当在不拥有监视器的情况下调用wait或notify时,会抛出该命令。 我想知道同步是否在主对象上,为什么它不被拥有。 这是我的密码 class ThreadA implements Runnable { Main main; Object o = new Object(); ThreadA(Main m) {

我正在学习java中的多线程。现在我要打印123123。。。从三个不同的线程。我知道存在其他解决方案,但我需要了解引发异常的原因。。 根据oracle文档,当在不拥有监视器的情况下调用wait或notify时,会抛出该命令。 我想知道同步是否在主对象上,为什么它不被拥有。 这是我的密码

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
语句中几乎从来都不是一个好主意。