我目前正在开发一款使用LWJGL 3.0.0b的游戏,并且出现了一个奇怪的现象。
背景
我有一个自定义实体类和一个实体管理器来存储我的实体。当实体更新时,一个方法被称为名为" tickTrail
"它增加了一个跟踪实体,使图形在视觉上更好,更有趣。
我已将其简化为entities.size()
功能,是的,我试着自己解决这个问题:P
我目前的解决方案是替换所有类似的方法:
for (int i = 0; i < entities.size(); i++)
{
//calls a method for drawing, updating, or input
}
将每个entities.size()
替换为size
。 size
是一个变量,当实体被添加,删除,清除列表或仅移除敌人时,它会发生变化。
此方法100%工作,窗口拖动不会使用此方法使程序崩溃。
问题
总而言之,最后一个问题是为什么会发生这种情况?我还没有确定为什么拖动一个窗口并使用ArrayList的size()方法崩溃程序,但在其位置存储变量是完全正常的。
对这种奇怪现象的任何帮助或解释都非常感激:)
修改 上次编辑证明不正确,即使使用大小变量程序仍然崩溃,时间回到绘图板....
编辑两个 好的,所以有时窗口拖动会在其他时间不起作用,这可能不仅仅是一个简单的size()方法调用:/
答案 0 :(得分:2)
根据你提供的内容很少,我猜测多个线程正在同时访问ArrayList而线程正在踩踏所有其他线程。
如果您没有通过Collections.synchronizedList()创建列表,以保证列表中的所有操作都是原子的,以便数组的内部不会被破坏。
我走这条路的原因是拖动Windows可能会生成多个事件来更新数组,而你正试图同时迭代它。
当您使用变量来查看大小时,并发问题就会消失。当然,除非您使用AtomicInteger或其他任何东西,否则您可能在变量中没有正确的值,但至少不会抛出异常。