我正在处理一些问题。我找到了一个有效的解决方案,但我仍然感到困惑,并认为有更好的解决方案。
我有一个模型类,其中包含类型为侦听器的集合,例如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())。
这对我有用,但我想知道是否有一些设计方法可以让它发挥作用。
我很感激任何帮助。感谢。