此生产者使用者的非法监视器状态异常吗?

时间:2018-07-12 14:22:20

标签: java multithreading algorithm concurrency

试图使用Java中的简单计数器练习生产者和消费者。 不知道为什么我在这段代码上收到非法的监视器状态异常。

我有在自己的线程中运行的计数器休息和计数器消耗方法。 计数器本身是一个静态的int volatile字段。 计数器类还可以锁定

如果我将等待导航更改为以下内容:

Counter.lock.notify();
Counter.lock.wait();

该代码有效。

>是否不等待wait()和notify()自动获取锁同步的引用?

生产者类别

package multithreading;


public class CounterProducer implements Runnable {


public void run() {

    try {   incrCounter();   } catch (InterruptedException e) {            e.printStackTrace();        }
}

public void incrCounter() throws InterruptedException {


    while (true) {
        synchronized (Counter.lock) {
            if (Counter.counter < 1) {
                System.out.println("Counter Reset");
                Counter.counter = 10;
                notify();
                wait();
            }


        }
    }


}

}

消费阶层

package multithreading;


public class CounterConsumer implements Runnable {


    public void run() {

        try {   consumeCounter();   } catch (InterruptedException e) {            e.printStackTrace();        }
    }

    public void consumeCounter() throws InterruptedException {


        while (true) {
            synchronized (Counter.lock) {
                if (Counter.counter > 0) {
                    System.out.println("Consumed");
                    Counter.counter--;
                    notify();
                    wait();
                }


            }
        }


    }

}

The Counter

public class Counter {

    public static volatile int counter;

    public static final Object lock = new Object();

}

柜台

public class CounterRunner {

    public static void main(String[] args) {

        Thread con = new Thread(new CounterConsumer());
        Thread prod = new Thread(new CounterProducer());

        con.start();
        prod.start();

    }


}

跑步者

public class CounterRunner {

    public static void main(String[] args) {

        Thread con = new Thread(new CounterConsumer());
        Thread prod = new Thread(new CounterProducer());

        con.start();
        prod.start();

    }


}

1 个答案:

答案 0 :(得分:2)

  

如果将wait naotify更改为以下内容,则代码将起作用:

Counter.lock.notify();
Counter.lock.wait();

每个Java方法都是某个类的静态方法或某个对象的实例方法。如果您看到一个不包含显式类名或对象引用的方法调用,则它是对属于this对象的方法的隐式调用。

也就是说,notify()的含义与this.notify()相同,而wait()的含义是this.wait()

this,是指CounterProducer实例出现在您的CounterProducer.incrCounter()方法中,它是指CounterConsumer实例,出现在您的{{1}中}方法。