【问题标题】: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 也是另一个线程安全的。当然,两者都有一定的开销。

      【讨论】:

        猜你喜欢
        • 2014-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-20
        • 2023-04-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多