Java生产者/消费者并发问题-尝试读取对象时出现NoSuchElementFound异常

问题描述 投票:0回答:2

我们有生产者消费者的这种实现方式。有时我们在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;
    }
}
java concurrency linked-list synchronized producer-consumer
2个回答
0
投票

您的readRecord是同步的,因此一次最多可以有一个readRecord,但是没有什么可以阻止readRecordwriteRecord同时运行,因为它们锁定在不同的对象上。如果碰巧writeRecord位于添加记录的中间,因此isEmpty返回false,但是removeFirst找不到元素,因为writeRecord尚未完成添加,您将得到该异常。 >

listLock中的readRecord上同步,或者摆脱listLock并声明两个方法都已同步以修复它。

© www.soinside.com 2019 - 2024. All rights reserved.