【问题标题】:Avoiding concurrent modification in observer pattern避免观察者模式的并发修改
【发布时间】:2014-06-13 08:53:56
【问题描述】:
假设您实现了一个观察者模式,并且观察者可以决定在 onUpdate 方法上从您的主题中取消注册自己(或其他观察者)。
假设您使用 ArrayLists 来保存观察者,这将导致 java.util.ConcurrentModificationException,因为您在迭代列表时删除了项目。
解决这个问题最好的方法是什么?
目前我正在克隆列表,以便对 onUpdate 方法的克隆进行迭代,但我相信应该有更好的解决方案...
【问题讨论】:
标签:
java
design-patterns
observer-pattern
【解决方案1】:
有许多支持这一点的集合。例如,jME3 使用他们自己的 ArrayList 变体,称为SafeArrayList。这是一个开源项目,因此您可以在那里找到实现。
比每次读取都克隆更好的解决方案是在修改时复制列表。只需创建一个新列表,对其进行更改,然后将其分配回您的听众列表。
在大多数情况下,观察者的变化发生的频率低于观察者的循环。
如果您复制列表并修改克隆,那么迭代列表的先前版本的任何内容都不会看到更改,但也不会例外。
【解决方案2】:
按照您当前的操作迭代副本是一种解决方案。使用CopyOnWriteArrayList 也是另一个线程安全的。当然,两者都有一定的开销。