挥发性arraylist没有按预期行事

时间:2013-03-31 12:18:43

标签: java multithreading synchronized volatile concurrentmodification

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

这是我的问题的一个例子

我的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);
}

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

Vector

  

从Java 2平台v1.2开始,这个类被改装为   实现List接口,使其成为Java的成员   馆藏框架。与新的集合实现不同,   矢量是同步的。