java - LinkedList 中的 ConcurrentModificationException

标签 java linked-list

我正在尝试设计一种将流程图转换为 Java 或任何其他代码的软件。但是我反复收到 ConcurrentModificationException .. 但是我不能使用 boolean 值来防止并发修改,因为对链表的访问发生在不同的地方。

因此,作为解决方案,我创建了以下适配器类。但是,它也会从 next 方法中抛出相同的异常。有没有其他解决方案,或者如果可以,请让我知道如何修改我的代码...

非常感谢...

import java.util.Iterator;
import java.util.LinkedList;

public class LinkedListAdapter<T> extends LinkedList<T>{

@Override
public boolean add(T t){

    boolean b;

    synchronized(this){
        b = super.add(t);
    }

    return b;
}

@Override
public T remove(){

    T t;

    synchronized(this){
        t = super.remove();
    }

    return t;
}

@Override
public Iterator<T> iterator(){

    final LinkedListAdapter<T> adap = this;

    return 
        new Iterator<T>(){

        private Iterator<T> iter;

        {
            synchronized(adap){
                iter = LinkedListAdapter.this.getIterator();
            }
        }

        @Override
        public boolean hasNext() {

            boolean b;

            synchronized(adap){
                b = iter.hasNext();
            }

            return b;
        }

        @Override
        public T next() {

            T t;

            synchronized(adap){
                t = iter.next();
            }

            return t;
        }

        @Override
        public void remove() {
            throw new UnsupportedOperationException();
        }
    };
}

protected Iterator<T> getIterator() {

    Iterator<T> iter;

    synchronized(this){
        iter = super.iterator();
    }

    return iter;
}
}

最佳答案

ConcurrentModificationException 通常在遍历列表时抛出,同时通常另一个线程甚至同一个循环试图修改(添加/删除)列表的内容。

关于java - LinkedList 中的 ConcurrentModificationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12410093/

相关文章:

java - 如何从 WSDL 文件生成 gwt 类

java - 返回动态类的实例

java - 应用所有交替操作后计算计数器的值

复制链表C中的节点

java - 当前项目和插件组中的错误 "No plugin found for prefix ' archetype' 正在创建新的 java maven 项目

java - 显示可扩展列表子项而不触摸标题

c - 收到 SIGSEGV 错误。找不到负责的指针

c++ - std::out_of_range 错误?

c++ - 赋值后值可以改变吗?

c - 无法访问类型转换的虚空指针