Collections.synchronizedList<*>(ArrayList()) 报错ConcurrentModificationException

56 阅读1分钟

使用以下方式创建出来的ArrayList在线上出现了ConcurrentModificationException

val listenerList = Collections.synchronizedList<*>(ArrayList(2))

使用场景中会有多个线程对listenerList做增删和遍历操作

通过查看源码可以发现,Collections.synchronizedList只能保证list的增删操作是synchronized,但不能保证遍历操作,源码也给出了使用SynchronizedList需要使用者手动synched的提示

image.png

解决方式一:

在遍历时加锁

synchronized(this) {
    listenerList.forEach{}
}

解决方式二:

使用CopyOnWriteArrayList

val listenerList = CopyOnWriteArrayList<*>()