避免观察者模式中的并发修改

时间:2014-06-13 08:53:56

标签: java design-patterns observer-pattern

考虑你实现了一个观察者模式,并且观察者可以决定在onUpdate方法中从你的主题中取消注册自己(或其他观察者)。

假设您正在使用ArrayLists来保存您的观察者,这将导致java.util.ConcurrentModificationException,因为您在迭代列表时删除了项目。

哪种方法可以解决这个问题?

目前我正在克隆列表,以便迭代onUpdate方法的克隆,但我相信应该有更好的解决方案......

2 个答案:

答案 0 :(得分:2)

有许多系列支持此功能。例如,jME3使用自己的ArrayList变体SafeArrayList。这是一个开源项目,所以你可以在那里找到实现。

比每次读取克隆更好的解决方案是在修改时复制列表。只需创建一个新列表,对其进行更改,然后将其分配回您的侦听器列表。

在大多数情况下,观察者的变化发生的次数少于循环观察者。

如果您复制列表并修改克隆,那么迭代上一版本列表的任何内容都不会看到更改,但也不会例外。

答案 1 :(得分:2)

在您正在执行此操作时迭代副本是一种解决方案。使用CopyOnWriteArrayList也是另一个线程安全的。当然,两者都有一定的开销。