一、代码示例
public class ArrayListNotSafeDemo {
public static void main(String[] args) {
List list = new ArrayList<>();
for (int i = 1; i <= 30; i++) {
new Thread(() -> {
//Constructs an empty list with an initial capacity of ten.
list.add(UUID.randomUUID().toString().substring(0, 8));
System.out.println(list);
}, String.valueOf(i)).start();
}
}
}
二、故障现象
java.util.ConcurrentModificationException
三、导致原因
一个线程正在写,另一线程过来抢夺,导致数据不一致,即并发修改导致的异常
三、解决方案
new Vector<>()
Collections.synchronizedList()
new CopyOnWriteArrayList<>(); 写时复制,读写分离的思想,好处是读操作完全无锁
使用场景:
1、写操作非常少的场合,能容忍读写的短暂不一致。
2、CopyOnWriteArrayList迭代器是只读的,不支持增删改。
四、其他的集合类线程不安全解决方案
Set:CopyOnWriteArraySet
Map:ConcurrentHashMap