Java 侦听器的并发集合

Java 侦听器的并发集合,java,concurrency,Java,Concurrency,我正在处理一些问题。我找到了一个有效的解决方案,但我仍然感到困惑,认为还有更好的解决方案 我有一个模型类,它包含类型为IListener的侦听器集合。允许其他类通过公共方法添加或删除侦听器 我的模型类使用两个线程来更新一些数据,在这个过程完成后,监听器会收到关于模型更改的通知 所以代码是这样的 void updateThread1() { synchronized (lock) { updateLogic(); List<IListener>

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

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

我的模型类使用两个线程来更新一些数据,在这个过程完成后,监听器会收到关于模型更改的通知

所以代码是这样的

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

我无法判断创建数组副本是否是原子的,即ArrayListaddAll使用了一些本机数组副本机制

我尝试使用CopyOnWriteArrayList,这很好用。第二种方法是使用ConcurrentHashMap支持的CollectionsnewSetFromMap中的并发哈希集

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


我非常感谢你的帮助。谢谢。

既然您已经在同一个锁上同步了这些方法,为什么不同步允许添加/删除侦听器的方法呢?如果不是侦听器列表,那么同步块支持的状态是什么?也就是说,如果您选择不使用同步,CopyOnWriteArrayList似乎是一个不错的选择,因为您可能只有很少的侦听器,并且很少添加/删除它们。是的,但是从EDT调用的添加/删除方法可能会被阻止一段时间。我试图避免它。@从EDT调用的user464592可能是-在AWT/Swing API中实现的所有方法都必须在EDT上调用