集合类安全问题
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
。