并发收集的侦听器

时间:2014-06-16 08:14:49

标签: java concurrency

我正在处理一些问题。我找到了一个有效的解决方案,但我仍然感到困惑,并认为有更好的解决方案。

我有一个模型类,其中包含类型为侦听器的集合,例如IListener。允许其他类通过公共方法添加或删除监听器。

我的模型类使用2个线程来更新某些数据,在此过程完成后,将通知侦听器有关模型更改的信息。

所以代码就像这样

void updateThread1() {
    synchronized (lock) {
        updateLogic();
        List<IListener> listenersCopy = new ArrayList<>(listeners);
        for (IListener listener : listenersCopy) {
             listener.dataUpdated();
        }
    }

void updateThread2() {
    synchronized (lock) {
        updateLogic2();
        List<IListener> listenersCopy = new ArrayList<>(listeners);
        for (IListener listener : listenersCopy) {
             listener.dataUpdated();
        }
    }

这是我的问题:因为侦听器可以被不同的线程添加或删除,然后是updateThread1和updateThread2,所以很有可能获得ConcurrentModificationException。

我无法判断创建数组副本是否是原子的(即ArrayList#addAll()使用一些本机数组复制机制)。

我尝试使用CopyOnWriteArrayList,它工作正常。第二种方法是使用ConcurrentHashMap支持的并发哈希集(来自Collections#newSetFromMap())。

这对我有用,但我想知道是否有一些设计方法可以让它发挥作用。

我很感激任何帮助。感谢。

0 个答案:

没有答案