Wetts's blog

Stay Hungry, Stay Foolish.

0%

Java-API-容器-线程安全的ArrayList

Java中ArrayList不是线程安全的对象。如果需要线程安全的ArrayList有三种方式:

  1. Vector
  2. CopyOnWriteArrayList
  3. Collections.synchronizedList(list)

Vector

从JDK1.0开始,Vector便存在JDK中,Vector是一个线程安全的列表,采用数组实现。其线程安全的实现方式是对所有操作都加上了synchronized关键字,这种方式严重影响效率,因此,不再推荐使用Vector了。

CopyOnWriteArrayList

写操作性能较差,而多线程的读操作性能较好。

因为该对象写操作的时候,会拷贝一个新的数组,在新的数组中进行写操作,操作完毕之后,将引用指向新的对象上。

Collections.synchronizedList(list)

其实现线程安全的方式是建立了list的包装类,对部分操作加上了synchronized关键字以保证线程安全。

结论

CopyOnWriteArrayList,发生修改时候做copy,新老版本分离,保证读的高性能,适用于以读为主,读操作远远大于写操作的场景中使用,比如缓存。而Collections.synchronizedList则可以用在CopyOnWriteArrayList不适用,但是有需要同步列表的地方,读写操作都比较均匀的地方。