ArrayList线程不安全性
Arraylist 的底层实现时数组结构,但是在平时使用的时候并没有出现过线程安全性问题
List<String> list = new ArrayList<String>();
for (int i = 0; i <5 ; i++) {
list.add(i+"");
}
并不会出现线程安全性问题应为只有一个单线程使用
for (int i = 0; i < 5; i++) {
new Thread(()->{
list.add(UUID.randomUUID().toString());
}).start();
}
当使用多线程的时候就会出现
java.util.ConcurrentModificationException
原因就是多线程环境的时候 线程1 得到 第0 位但是没有插入时间片用尽 线程2 得到时间片也获取到第0 位 插值后线程1 得到时间片 将线程2 的值覆盖 造成添加丢失。
解决Arraylist 的线程安全性问题
1.可以考虑 使用 vector 来替代arraylist 但是 vector锁的粒度比较大
2.使用工具类 Collections.synchronizedList(list); 来修饰
3. 使用 CopyOnWriteArrayList; 来实现arraylist的线程安全