1

我正在编写一个多线程的平台游戏。一个线程执行绘画工作,另一个线程运行游戏逻辑。我有一个数组列表,两个线程需要同时访问。我在我的绘制线程遍历数组列表中的所有元素,并且在我的另一个线程中,我有时会删除或添加元素到数组列表中。我得到了一个并发修改异常,但我不明白为什么,因为volatile关键字只允许一个线程一次访问一个变量。挥发性arraylist不按预期行事

这里是我的问题的一个例子

我的ArrayList

private volatile ArrayList<Entity> entities = new ArrayList<Entity>(); 

我的画码

for(Entity entity : entities) 
    { 
     if(entity!=null && entity.getX()>=xs-Block.WIDTH && entity.getX()<=xs+Main.WIDTH) 
      g.drawImage(entity.getImage(), entity.getX()-getXs(), entity.getY(), entity.getWidth(), entity.getHeight(), null); 
    } 

我删除代码

public void removeEntity(Entity e) 
{ 
    entities.remove(e); 
} 
+0

请张贴代码,如果你已经尝试了一些 – Abubakkar

回答

3

不,它不。 volatile关键字只保证您对所有线程都能看到任何声明为volatile的变量的修改。

例如,您需要正确同步您的代码或使用CopyOnWriteArrayList

+0

谢谢CopyOnWriteArrayList工作 –

0

而不是使用volatile使用Collections.synchronizedList(list);

0

您可以使用已同步的矢量。

Vector

从Java 2平台v1.2,这个类被改造为 实现List接口,使它成为Java的 Collections Framework的成员。与新的收集实现不同, 矢量是同步的。

+0

我以前尝试过矢量它仍然抛出一个异常 –