目录
List集合线程不安全操作
集合线程不安全案例
package com.atguigu.test;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
/**
* 集合线程安全案例
*/
public class NotSafeDemo {
/**
* 多个线程同时对集合进行修改
* @param args
*/
public static void main(String[] args) {
List list = new ArrayList();
for (int i = 0; i < 100; i++) {
new Thread(() ->{
list.add(UUID.randomUUID().toString());
System.out.println(list);
}, "线程" + i).start();
}
}
}
异常内容
java.util.ConcurrentModificationException
问题: 为什么会出现并发修改异常?
查看 ArrayList 的 add 方法源码
public boolean add(E e) {
ensureCapacityInternal(size + 1);
// Increments modCount!! elementData[size++] = e;
return true;
}
那么我们如何去解决 List 类型的线程安全问题?
Vector
Vector 是矢量队列,它是 JDK1.0 版本添加的类。
- 继承于 AbstractList,实现了 List, RandomAccess, Cloneable 这些接口。
- Vector 继承了 AbstractList, 实现了 List;所以,它是一个队列,支持相关的添加、删除、修改、遍历等功能。
- Vector 实现了 RandmoAccess 接口,即提供了随机访问功能。
- RandmoAccess 是 java 中用来被 List 实现,为 List 提供快速访问功能的。
- 在 Vector 中,我们即可以通过元素的序号快速获取元素对象;这就是快速随机访问。
Vector 实现了 Cloneable 接口,即实现 clone()函数。它能被克隆。 - 和 ArrayList 不同,Vector 中的操作是线程安全的。
List集合线程安全案例1
NotSafeDemo 代码修改
package com.atguigu.test;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.Vector;
/**
* 集合线程安全案例
*/
public class NotSafeDemo {
/**
* 多个线程同时对集合进行修改
* @param args
*/
public static void main(String[] args) {
List list =