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

Java生产者/消费者并发问题-尝试读取对象时发现NoSuchelementException,java,concurrency,linked-list,synchronized,producer-consumer,Java,Concurrency,Linked List,Synchronized,Producer Consumer,我们有生产者消费者的这个实现。 有时,我们在readRecord()方法中不会得到任何TouchElementException。 理想情况下,这不应该发生,因为有一个if语句,并且该方法是同步的,这确保在任何时间点只执行一个线程。 但我们仍然没有任何例外。有人能给我引路吗 import java.util.LinkedList; public class Listner{ private LinkedList<Object> objList = new LinkedList

我们有生产者消费者的这个实现。 有时,我们在readRecord()方法中不会得到任何TouchElementException。 理想情况下,这不应该发生,因为有一个if语句,并且该方法是同步的,这确保在任何时间点只执行一个线程。 但我们仍然没有任何例外。有人能给我引路吗

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;
    }
}
import java.util.LinkedList;
公共类列表器{
private LinkedList objList=new LinkedList();
私有对象listLock=新对象();
公共无效写入记录(对象obj){
已同步(列表锁){
objList.add(obj);
}
}
公共同步对象readRecord(){
objectobj=null;
如果(!objList.isEmpty())
obj=objList.removeFirst();
返回obj;
}
}

您的
readRecord
是同步的,因此一次最多只能有一个
readRecord
,但是没有什么可以阻止
readRecord
writeRecord
同时运行,因为它们锁定在不同的对象上。如果<>代码> WrreReCordOR/<代码>在添加一个记录的中间,那么代码> iSoLe>/Cult>返回false,但是<代码> ReaveFrime找不到元素,因为WrreReCordOrd> /Cyto>尚未添加它,您将得到该异常。


readRecord
中同步
listLock
,或者去掉
listLock
,并声明这两种方法都已同步以修复它。

为什么要为
writeRecord
readRecord
锁定不同的对象?首先,我不是这段代码的作者。我所要做的就是解决这个实现中的一个问题。这就是我所说的问题。塞德谢谢你回答了这个问题。再跟进一次。这可以通过编写单元测试重现吗?您必须运行两个线程。因为读者和作者之间是同步的,所以更多的内容将毫无意义。这将是随机的。从一个空列表开始,在单独的线程中有一个writer和一个reader,以增加失败的可能性。“这可以通过编写单元测试来复制吗?”——您不能保证复制它。并发/同步错误就是这样。@BurakSerdar谢谢你的建议。我试试看。