Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 易失性arraylist未按预期运行_Java_Multithreading_Synchronized_Volatile_Concurrentmodification - Fatal编程技术网

Java 易失性arraylist未按预期运行

Java 易失性arraylist未按预期运行,java,multithreading,synchronized,volatile,concurrentmodification,Java,Multithreading,Synchronized,Volatile,Concurrentmodification,我正在写一个多线程平台的游戏。一个线程完成绘画任务,另一个线程运行游戏逻辑。我有一个两个线程都需要同时访问的数组列表。我在画图线程中迭代数组列表的所有元素,在另一个线程中,有时会删除或向数组列表中添加元素。我得到了一个并发修改异常,但我不明白为什么,因为volatile关键字一次不允许一个线程访问一个变量 这是我的问题的一个例子 我的arraylist private volatile ArrayList<Entity> entities = new ArrayList<Ent

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

这是我的问题的一个例子

我的arraylist

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

不要使用
volatile
使用
Collections.synchronizedList(列表)

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


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

您可以使用已同步的vector

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


如果您尝试过一些,请发布代码
    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);
}