【发布时间】:2012-09-13 15:46:02
【问题描述】:
我正在尝试设计一种将流程图转换为 java 或任何其他代码的软件。但是我反复得到 ConcurrentModificationException .. 但是我不能使用布尔值来防止并发修改,因为对链表的访问发生在不同的地方。
因此,作为解决方案,我创建了以下适配器类。但是,它也会从下一个方法抛出相同的异常。是否有任何其他解决方案或者如果可以,请让我知道如何修改我的代码......
非常感谢...
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;
}
}
【问题讨论】:
-
@SLaks “一旦你修复它就会起作用”必须是对 SO 最有帮助的评论。
-
@josefx:我的意思是他的问题是完全倒退。
-
是的。这是正确的。在设计软件时,我没想到会出现任何多线程问题,因为我使用的是单线程。然而,使用paintComponent 时会意外出现多线程问题。然后作为解决方案,我尝试使用适配器。非常感谢
标签: java linked-list