Java中ArrayList不是线程安全的对象。如果需要线程安全的ArrayList有三种方式:
- Vector
- CopyOnWriteArrayList
- Collections.synchronizedList(list)
Vector
从JDK1.0开始,Vector便存在JDK中,Vector是一个线程安全的列表,采用数组实现。其线程安全的实现方式是对所有操作都加上了synchronized关键字,这种方式严重影响效率,因此,不再推荐使用Vector了。
CopyOnWriteArrayList
写操作性能较差,而多线程的读操作性能较好。
因为该对象写操作的时候,会拷贝一个新的数组,在新的数组中进行写操作,操作完毕之后,将引用指向新的对象上。
Collections.synchronizedList(list)
其实现线程安全的方式是建立了list的包装类,对部分操作加上了synchronized关键字以保证线程安全。
结论
CopyOnWriteArrayList,发生修改时候做copy,新老版本分离,保证读的高性能,适用于以读为主,读操作远远大于写操作的场景中使用,比如缓存。而Collections.synchronizedList则可以用在CopyOnWriteArrayList不适用,但是有需要同步列表的地方,读写操作都比较均匀的地方。