Java 无法获取线程锁

丹尼尔·B

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

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

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

多莫日罗夫

那是因为你wait()不是在lockobject调用,而是 on this,同时同步 on lock既然你没有自己的监视器thisIllegalMonitorStateException就抛出来。所以修复是lock.wait()

但即使有了这个修复,你的代码也会永远挂起,因为notify/notifyAll永远不会被调用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章