使用以下方式创建出来的ArrayList在线上出现了ConcurrentModificationException
val listenerList = Collections.synchronizedList<*>(ArrayList(2))
使用场景中会有多个线程对listenerList做增删和遍历操作
通过查看源码可以发现,Collections.synchronizedList只能保证list的增删操作是synchronized,但不能保证遍历操作,源码也给出了使用SynchronizedList需要使用者手动synched的提示
解决方式一:
在遍历时加锁
synchronized(this) {
listenerList.forEach{}
}
解决方式二:
使用CopyOnWriteArrayList
val listenerList = CopyOnWriteArrayList<*>()