ArrayList
ArrayList是一个集合,特点: 有序,元素可重复,随机查找快,删除和插入较慢,线程不安全.
默认10个容量大小,底层实现是一个数组和动态扩容技术,扩容时是当前容量的1.5倍,即10*150% = 15.
案例代码
public class ArrayListConcurrentDemo {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
for (int i = 0; i < 30
; i++) {
new Thread(()->{
list.add(UUID.randomUUID().toString().substring(0,8));
System.out.println(list);
},"t"+i).start();
}
}
}
导致原因
高并发情况下,多个线程调用add方法产生的错误.
解决方案
-
Vector
Vector是线程安全的,源码中有synchronized关键字55个,包括add方法也是synchronized修饰的,所以高并发情况下不会报错.
-
Collections.synchronizedList
集合工具类提供了把ArrayList转换成线程安全的方法,底层是采用同步代码块,性能相比Vector而言会好,因为Vector是整个方法锁住,Collections.synchronizedList同步代码块粒度更细,相对性能较好.
-
CopyOnWriteArrayList
CopyOnWriteArrayList底层有采用ReentrantLock加锁,来保证线程安全,每添加1个元素,就会生成一个新数组并覆盖原来的数组,有点读写分离的感觉.