gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 18:40:27 24 4
gpt4 key购买 nike

我们有生产者消费者的实现。有时我们会在 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,但是没有什么可以阻止 readRecordwriteRecord 并发运行,因为它们锁定不同的对象。如果碰巧 writeRecord 正在添加记录,则 isEmpty 返回 false,但 removeFirst 无法找到该元素,因为 writeRecord 尚未完成添加,您会收到该异常。

readRecord 中对 listLock 进行同步,或者删除 listLock 并将这两个方法声明为同步来修复它。

关于Java 生产者/消费者并发问题 - 尝试读取对象时出现 NoSuchElementFound 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59942497/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com