最近在处理线上crash的过程中,发现少量由多线性访问导致的线程安全问题

  1. ConcurrentModificationException
  2. ArrayIndexOutOfBoundsException

顺便整理了一下,可用的List:

  1. CopyOnWriteArrayList
    修改时会复制一份数组,修改后再赋值内部数组
  2. Collections.synchronizedList
    内部有个锁对象,修改时用 synchronized 加锁
    由于没有重写iterator()方法,遍历元素时,需要对对象加锁
1
2
3
4
5
6
7
8
9
List list = Collections.synchronizedList(new ArrayList());

...

synchronized (list) {
Iterator i = list.iterator();
while (i.hasNext())
foo(i.next());
}
  1. Vector
    方法加锁