ArrayList--应对线程不安全
一、ArrayList是线程不安全的
public class ArrayListDemo{
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, 10));
System.out.println(list);
}).start();
}
}
}
多线程环境下,执行以上代码出现异常:java.util.ConcurrentModificationException

解决方式:
1. new Vector();
原理:执行的add方法 synchronized关键字修饰
2. Collections.synchronizedArrayList(new ArrayList<>());
3. new CopyOnWriteArrayList<>();
原理:该类的数组为volatile,add方法使用了Lock

写时复制:
CopyOnWrite容器即写时复制的容器。往一个容器添加元素时,不再当前容器Object[]中添加,而是copy当前容器到新容器Object[] newElements,将新元素添加到新容器。添加完元素将原有容器的引用指向新容器setArray(newElements);
好处是,对CopyOnWrite容器可以并发的读,不用加锁。独写分离的思想。
二、HashSet--线程不安全
通ArrayList类似,HashSet并不是线程安全的类。
解决方案
1. Collections.synchronizedSet(new HashSet());
2. new CopyOnWriteArraySet<>()---底层实现是CopyOnWriteArrayList

三、hashMap--线程不安全
解决方案
1. Collections.synchronizedMap(new HashMap<>());
2. ConcurrentHashMap<>();
浙公网安备 33010602011771号