java - volatile 数组列表未按预期运行

标签 java multithreading synchronized volatile concurrentmodification

我正在编写一个多线程平台游戏。一个线程执行绘画工作,另一个线程运行游戏逻辑。我有一个数组列表,两个线程都需要同时访问。我在我的绘制线程中迭代数组列表的所有元素,而在我的另一个线程中,我有时会删除或添加元素到数组列表。我得到一个并发修改异常,但我不明白为什么,因为 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);
}

最佳答案

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

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

关于java - volatile 数组列表未按预期运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15729292/

相关文章:

java - 如何使用 BlueJ 编译使用 .jar 文件类的代码?

java - 将Java连接到MySQL数据库

android - pending是不是代表它的execute方法在Android中还没有被调用?

java静态同步方法

javascript - 具有同步用户提示的异步功能

java - 使用多个 Java 类的 React-Native

java - 使用 Java FTP 客户端从 ColdFusion 9 保护 FTP

java - 获取锁后重新分配对象变量

java - 在进行长时间比较时更新 JProgressBar

Java : what debug to add to find what caused a process to hang