1

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

这是我的问题的一个例子

我的数组列表

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);
}
4

3 回答 3

3

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

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

于 2013-03-31T12:23:13.083 回答
0

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

于 2013-03-31T12:22:53.800 回答
0

您可以使用 vector ,它是同步的。

向量

从 Java 2 平台 v1.2 开始,该类被改进为实现 List 接口,使其成为 Java Collections Framework 的成员。与新的集合实现不同,Vector 是同步的。

于 2013-03-31T12:27:47.283 回答