一:不能光知道ArrayList是线程不安全的,如果面试官让你手写怎么办呢?
手写ArrayList线程不安全案例:
public class ArrayListThreadDemo {
public static void main(String[] args) {
//System.out.println("list");
List<String> list=new ArrayList<>();
for (int i=1;i<=30;i++){
new Thread(() -> {
list.add(UUID.randomUUID().toString().substring(0,8));
// System.out.println("list");
System.out.println(list);
},String.valueOf(i)).start();
}
}
}
我们现在模拟高并发的情况下去给集合添加元素,让30个线程去执行这段代码,看会出现什么情况:
我们可以看出报错了,出现了并发修改异常。
二:如何解决呢?
1:List<String> list=new Vector<>();
Vector在add方法底层进行加锁处理,是之变成线程安全
Vector:底层数据结构是数组,查询快,增删慢,线程安全,效率低
2:collection 和 Collections 有什么区别?
java.util.Collection 是一个集合接口(集合类的一个顶级接口)。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式,其直接继承接口有List与Set。
Collections则是集合类的一个工具类/帮助类,其中提供了一系列静态方法,用于对集合中元素进行排序、搜索以及线程安全等各种操作。
所以可以:
List<String> list=Collections.synchronizedList(newArrayList<String>());
所以也可以用Collections去处理set等线程不安全的问题
3:java.util.concurrent包中的写实复制方法
List><String> list=new CopyOnWriteArrayList();
这个方法的底层的add()方法加了Lock锁