Java无法获取线程锁

时间:2018-07-26 14:36:48

标签: java multithreading

我正在测试一些Java多线程的东西,并且遇到了这个问题: 我有一个线程,它调用Producer类的方法,并且该方法在我在构造函数中传递的对象上锁定了一个同步块。 App.class:

public class App {

    public static void main(String[] args) {
        Object lock = new Object();
        Producer producer = new Producer(lock);

        Thread producerThread = new Thread(new Runnable() {
            @Override
            public void run() {
                producer.produce();
            }
        });

        producerThread.start();
        try {
            producerThread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}

生产者类别:

public class Producer {

    private final Object lock;

    public Producer(Object lock) {
        this.lock = lock;
    }

    public void produce() {
        synchronized (lock) {
            System.out.println("Producer started ...");
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Producer resumed");
        }
    }
}

然后我得到:

Exception in thread "Thread-0" java.lang.IllegalMonitorStateException
    at java.base/java.lang.Object.wait(Native Method)
    at java.base/java.lang.Object.wait(Object.java:328)
    at Producer.produce(Producer.java:13)
    at App$1.run(App.java:15)
    at java.base/java.lang.Thread.run(Thread.java:844)

Process finished with exit code 0

那么,当我通过构造函数传递锁对象时会发生什么,为什么它不起作用?

1 个答案:

答案 0 :(得分:0)

这是因为,您在wait()上同步时,不是在lock对象上而是在this上调用lock。由于您不拥有this上的监视器,因此会抛出IllegalMonitorStateException。 因此解决方法是lock.wait()

但是即使修复了该问题,您的代码也将永远挂起,因为从未调用过notify / notifyAll