集合类安全问题

List
ArrayList是非线程安全类,在多线程同时写的情况下,会抛出异常java.util.ConcurrentModificationException
1 | private static void listNotSafe() { |
解决方法:
使用
Vector(ArrayList所有方法加synchronized,太重)。
使用
Collections.synchronizedList()转换成线程安全类。方法对变量mutex加锁实现方法线程安全(线程安全仅仅指的是直接使用它提供的函数,如list.add(),list.get(i); 也就是说仅仅是原子操作的时候才是线程安全的)

使用
java.concurrent.CopyOnWriteArrayList(推荐)。
CopyOnWriteArrayList和CopyOnWriteSet
CopyOnWriteArrayList通过写时复制来实现读写分离,比如add方法,先复制一个新数组,长度+1,并且将新元素放置到最后。
1 | public boolean add(E e) { |
缺点:
1、 集合复制耗内存。
2、 实时性不高。
使用场景:
1、读多写少
2、集合数据量不大
CopyOnWriteSet是线程安全类,与之相反HashSet和TreeSet都是线程不安全的。CopyOnWriteSet底层维护了一个CopyOnWriteArrayList。

