java - 通知给出 IllegalMonitorStateException

标签 java multithreading illegalmonitorstateexcep

我对多线程了解甚少。

我期望下面的程序能够完美运行,但它不起作用并产生以下异常。

Exception in thread "Thread-1" java.lang.IllegalMonitorStateException
    at java.lang.Object.notify(Native Method)
    at com.onmobile.client.D.callD(Deadlock.java:76)
    at com.onmobile.client.B.run(Deadlock.java:50)
    at java.lang.Thread.run(Unknown Source)

Java 文件

public class Deadlock {
    C c = new C();
    D d = new D();

    public static void main(String[] args) {    
        new Deadlock();
    }

    public Deadlock() {
        A a = new A(d,c);
        B b = new B(d,c);

        Thread t1 = new Thread(a);
        Thread t2 = new Thread(b);

        t1.start();
        t2.start();
    }
}

class A implements Runnable{
    D dObj;
    C cObj;

    A(D obj, C obj1){
        this.dObj = obj;
        this.cObj = obj1;
    }
    @Override
    public void run() {
        cObj.callC(dObj);
    }
}



class B implements Runnable{
    D dObj;
    C cObj;

    B(D obj, C obj1){
        this.dObj = obj;
        this.cObj = obj1;
    }
    @Override
    public void run() {
        dObj.callD(cObj);
    }
}


class C{
    public synchronized void callC(D dObj){
        try {
            this.wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        dObj.callD1();
    }
    public synchronized void callC1(){
    }   
}

class D{
    public synchronized void callD(C cObj){
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }       
        cObj.callC1();
        cObj.notify();
    }

    public synchronized void callD1(){
    }   
}

我认为在callC()方法中,类C的对象即cObj进入等待状态,同时控制将转到callD()方法并在那里调用cObj.notify(); 因此,这将唤醒等待对象 cObj 的等待线程。

但这给了我异常(exception)。 我认为解决我的问题可以是: Java: IllegalMonitorStateException on notify()

但我没有正确理解它。

请指导我哪里出错了。

最佳答案

当调用object.notify时,您必须持有该确切对象的锁,即:

synchronized(cObj) {
   cObj.notify();
}

您还应该将等待调用包装在类似的同步块(synchronized block)中:

synchronized(cObj) {
   cObj.wait()
}

我建议您在 Java 教程中阅读更多相关内容: http://docs.oracle.com/javase/tutorial/essential/concurrency/

关于java - 通知给出 IllegalMonitorStateException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19512272/

相关文章:

java - Java中对数字的数字求和

java - 变量变为 Null

ios - 实现异步 NSOperation

java - 两个线程等待时非法监视器状态异常

java - 创建对象时出现 IllegalMonitorStateException

java - 什么会导致同步块(synchronized block)内部的 IllegalMonitorStateException?

java - 如何将maven项目版本放入war文件 list 中?

java - Maven 3 Eclipse Kepler 是否需要有环境变量才能用于嵌入式 Maven?

java - Linux JVM 是否真的实现了线程优先级?

c# - 无法写入另一个进程 exp,多线程正忙的文件