我们已经实现了生产者消费者。
有时我们在readRecord()方法中得到NoSuchElementException。
理想情况下,这不应该发生,因为有一个if语句,并且该方法是同步的,以确保在任何时间点仅执行一个线程。
但是我们仍然得到NoSuchElementException。有人可以指导我一个吗?
import java.util.LinkedList;
public class Listner{
private LinkedList<Object> objList = new LinkedList<Object>();
private Object listLock = new Object();
public void writeRecord(Object obj){
synchronized(listLock) {
objList.add(obj);
}
}
public synchronized Object readRecord(){
Object obj = null;
if( !objList.isEmpty() )
obj = objList.removeFirst();
return obj;
}
}
最佳答案
您的readRecord
是同步的,因此一次最多只能有一个readRecord
,但是没有什么可以阻止readRecord
和writeRecord
同时运行,因为它们锁定在不同的对象上。如果碰巧writeRecord
在添加记录的中间,所以isEmpty
返回false,但是removeFirst
找不到元素,因为writeRecord
尚未完成添加,您将得到该异常。
在listLock
中的readRecord
上同步,或摆脱listLock
并将两个方法声明为已同步以修复它。
关于java - Java生产者/消费者并发问题-尝试读取对象时出现NoSuchElementFound异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59942497/