有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我们有生产者消费者的这个实现。 有时,我们在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;
    }
}

共 (1) 个答案

  1. # 1 楼答案

    你的readRecord是同步的,所以一次最多只能有一个readRecord,但是没有什么可以阻止readRecordwriteRecord同时运行,因为它们锁定在不同的对象上。如果{{CD4}}正处于添加记录的中间,那么{{*CD6}}返回false,但是^ {< CD7}}找不到元素,因为^ {CD4}}尚未完成添加,则会得到该异常。

    readRecord中的listLock上进行同步,或者去掉listLock并将这两个方法声明为已同步以修复它