考虑你实现了一个观察者模式,并且观察者可以决定在onUpdate方法中从你的主题中取消注册自己(或其他观察者)。
假设您正在使用ArrayLists来保存您的观察者,这将导致java.util.ConcurrentModificationException,因为您在迭代列表时删除了项目。
哪种方法可以解决这个问题?
目前我正在克隆列表,以便迭代onUpdate方法的克隆,但我相信应该有更好的解决方案......
答案 0 :(得分:2)
有许多系列支持此功能。例如,jME3使用自己的ArrayList变体SafeArrayList
。这是一个开源项目,所以你可以在那里找到实现。
比每次读取克隆更好的解决方案是在修改时复制列表。只需创建一个新列表,对其进行更改,然后将其分配回您的侦听器列表。
在大多数情况下,观察者的变化发生的次数少于循环观察者。
如果您复制列表并修改克隆,那么迭代上一版本列表的任何内容都不会看到更改,但也不会例外。
答案 1 :(得分:2)
在您正在执行此操作时迭代副本是一种解决方案。使用CopyOnWriteArrayList
也是另一个线程安全的。当然,两者都有一定的开销。