如何在不使用ConcurrentModificationException的情况下使用ArrayList?

时间:2011-05-01 07:57:16

标签: java arrays collections arraylist

JAVA

我的游戏中有一个ArrayList来存储游戏中的所有粒子。我有一个访问ArrayList来更新物理的更新方法,我有一个访问ArrayList的渲染方法来渲染屏幕上的粒子,还有一个MouseClick侦听器,当它检测到MouseClick时,它会向ArrayList添加一个新粒子。

我的问题是我不断收到java.util.ConcurrentModificationException。这是因为当我同时点击它渲染时,两个方法都试图访问ArrayList。是否有同时访问ArrayList的解决方案(不同的数据类型?)。

一些帮助的代码 -

ArrayList声明

ArrayList<Particle> ParticleList = new ArrayList<Particle>();

粒子类定义

public class Particle {

int x;
int y;
Color colour;
int type;
//0:wall
public Particle(int x,int y,Color colour,int type)
{
    this.x = x;
    this.y = y;
    this.colour = colour;
    this.type = type;
}`

渲染方法

for(Particle e : this.ParticleList)
{
g.fillRect(e.x, e.y, 1, 1);
}

2 个答案:

答案 0 :(得分:5)

更新:您似乎没有多线程访问,所以我的原始答案不成立(我会为了完整性而保留)

只有在迭代过程中添加或删除集合时,才会在单个线程中出现

ConcurrentModificationException。要解决这个问题,请创建一个新集合,该集合是第一个集合的副本,然后添加到集合中。


如果您的写入(点击)小于读取次数,则可以使用 CopyOnWriteArrayList

否则,您必须在迭代时进行同步。或者获取副本(List copy = new ArrayList(original)

答案 1 :(得分:2)

Swing本身是隐式单线程的。您的点击和渲染应该在同一个线程上。如果这样做,您将不会收到ConcurrentModificationException,因为您只会呈现或处理点击。