java.lang.IllegalMonitorStateException 正在从线程中运行的方法中抛出



我正在尝试使用以下方法创建基本的生产者/consuner类:

public class ProducerConsumer {
private final static int MAX_SIZE = 100;
private Queue<String> data = new PriorityQueue<>();
private Lock lock = new ReentrantLock();
private Condition bufferFull = lock.newCondition();
private Condition bufferEmpty = lock.newCondition();
public void produce(){
while(true) {
try {
lock.lock();
while (data.size() >= MAX_SIZE) {
bufferFull.await();
}
addData();
bufferEmpty.notifyAll();
} catch (InterruptedException e) {
System.out.println("error produce");
} finally {
lock.unlock();
}
}
}
public void consume(){
while(true) {
try {
lock.lock();
while (data.isEmpty()) {
bufferEmpty.await();
}
String value = data.poll();
System.out.println("Thread " + Thread.currentThread().getName() + " processing value " + value);
bufferFull.notifyAll();
} catch (InterruptedException e) {
System.out.println("error consume");
} finally {
lock.unlock();
}
}
}
private void addData(){
IntStream.range(0,10).forEach( i ->
data.add(new Date().toString())
);
}
public void start(int consumerNumber){
IntStream.range(0,consumerNumber)
.mapToObj(i -> new Thread(this::consume))
.collect(Collectors.toList())
.forEach(Thread::start);
Thread t = new Thread(this::produce);
t.start();
}
} 

但是它不断抛出错误:java.lang.IllegalMonitorStateException。我的问题是,为什么它会抛出这个错误?这个intance的方法在线程中运行,所以他们应该拥有条件锁,所以我不明白这个错误背后的含义。

感谢您的帮助!

bufferEmpty.notifyAll()

是错误的调用方法。该方法要求您将监视器放在"bufferEmpty"对象本身上,该对象与您正在使用的lock实例无关。

正确的调用方法是

bufferEmpty.signalAll();

最新更新