';发布';Java中列表上的迭代器
我正在尝试编写一个游戏引擎,其中一个精灵列表用于保存所有精灵(列表列表允许我以合理的方式排列精灵)。问题是,我需要反复添加和删除sprite,这很快就违反了fail-fast迭代器,给了我一个并发修改异常。我可以在一个列表上有多个迭代器吗?这会阻止异常吗?如果做不到这一点,是否有办法“释放”列表的迭代器,使列表不再检查修改 我可以在一个列表上有多个迭代器吗?这会阻止异常吗 是的,你可以,但不会。(迭代器检查列表的状态,以确定是否发生了并发修改。) 如果做不到这一点,是否有办法“释放”列表的迭代器,使列表不再检查修改 不,没有,至少在标准列表类中没有。这将是一个坏主意,因为这可能会导致异常和数据损坏,而fail fast迭代器的设计就是为了避免这些异常和数据损坏。(您希望您的应用程序因ConcurrentModificationException而意外失败,还是偶尔因随机数据结构损坏和/或奇怪的异常而失败?) 我认为您需要查看替代列表实现类,其中迭代器允许并发修改。根据应用程序使用列表的方式,可能包括:';发布';Java中列表上的迭代器,java,collections,Java,Collections,我正在尝试编写一个游戏引擎,其中一个精灵列表用于保存所有精灵(列表列表允许我以合理的方式排列精灵)。问题是,我需要反复添加和删除sprite,这很快就违反了fail-fast迭代器,给了我一个并发修改异常。我可以在一个列表上有多个迭代器吗?这会阻止异常吗?如果做不到这一点,是否有办法“释放”列表的迭代器,使列表不再检查修改 我可以在一个列表上有多个迭代器吗?这会阻止异常吗 是的,你可以,但不会。(迭代器检查列表的状态,以确定是否发生了并发修改。) 如果做不到这一点,是否有办法“释放”列表的迭代器
这具有完整的列表语义,但写入操作往往有点昂贵CopyOnWriteArrayList
这是您在列表上期望的大多数操作(但不是位置插入或删除),而写入操作更便宜ConcurrentLinkedQue
除了几个历史例外,
java.util
中的集合类型不是为并发/多线程用例设计的。如果您的应用程序需要由多个线程访问的集合类型,则需要查看java.util.concurrent
包中的实现。如果您希望迭代列表的内容,因为它们在特定时间存在,而与迭代过程中发生的任何修改无关,您只需创建一个副本并在副本上迭代即可
从性能的角度来看,这听起来可能很吓人,但我鼓励你尝试一下,只考虑替代品(如
java.util.concurrent…
还有google collections-guava有一些并发实现,可能值得一看。它不是并发的。列表在单个线程中引用,但是添加和删除是独立于遍历而完成的,遍历会导致不幸命名为ConcurrentModificationException。@DaedaluseSedPerl-没关系,它们可以工作。(如果你能想出一个比ConcurrentModificationException
更好/更合适的名字,我很想听听……UnauthorizedModificationException
,UnsafeModificationException
,这是一个意外的例外
,OhWaitisException
,YesiamalittledWhiththis exception
所有这些都会出现在我的脑海中。如何标记需要删除的精灵,然后分组删除它们?我已经这样做了,但添加精灵仍然存在问题。