我正在测试一些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
那么,当我通过构造函数传递锁对象时会发生什么,为什么它不起作用?
答案 0 :(得分:0)
这是因为,您在wait()
上同步时,不是在lock
对象上而是在this
上调用lock
。由于您不拥有this
上的监视器,因此会抛出IllegalMonitorStateException
。
因此解决方法是lock.wait()
但是即使修复了该问题,您的代码也将永远挂起,因为从未调用过notify
/ notifyAll
。