1 ArrayList线程不安全
List<String> list=new ArrayList<>();
for(int i=1;i<=50;i++){
new Thread(()->{
list.add(UUID.randomUUID().toString().substring(0,8));
System.out.println(list);
},String.valueOf(i)).start();
}
// 抛出异常: java.util.ConcurrentModificationException
1 故障现象
java.util.ConcurrentModificationException
2 导致原因
并发争抢修改导致。一个线程正在写入,另外一个线程也来写入,导致数据不一致,并发修改异常。
3 解决方案
new Vector<>();
Collections.synchronizedList(new ArrayList<>());
new CopyOnWriteArrayList(); // 思想: 写时复制,读写分离
2 HashSet线程不安全
Set<String> set=new HashSet<>();
for(int i=1;i<=50;i++){
new Thread(()->{
set.add(UUID.randomUUID().toString().substring(0,8));
System.out.println(set);
},String.valueOf(i)).start();
}
// 抛出异常: java.util.ConcurrentModificationException
解决方案
Collections.synchronizedSet(new HashSet<>());
new CopyOnWriteArraySet<>();
3 HashMap线程不安全
Map<String,String> map=new HashMap<>();
for(int i=1;i<=50;i++){
new Thread(()->{
map.put(Thread.currentThread().getName(),UUID.randomUUID().toString().substring(0,8));
System.out.println(map);
},String.valueOf(i)).start();
}
// 抛出异常: java.util.ConcurrentModificationException
解决方案
Collections.synchronizedMap(new HashMap<>());
new ConcurrentHashMap<>();