ArrayList不是线程安全类,在多线程同时写的情况下,会抛出java.util.ConcurrentModificationException
异常
解决办法:
1.使用Vector(ArrayList所有方法加synchronized,太重)
2.使用Collections.synchronizedList()转换成线程安全类
3.使用java.concurrent.CopyOnWriteArrayList(推荐)
通过写时复制来实现读写分离,比如其add()方法,就是先复制一个新数组,长度为原数组长度+1,然后将新数组最后一个元素设为添加的元素
package com.xd.thread;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CopyOnWriteArraySet;
public class ListNoSafeDemo {
public static void main(String[] args) {
mapDemo();
}
private static void mapDemo() {
// Map<String,String> map = new HashMap<>();
Map<String,String> map = new ConcurrentHashMap<>();
for (int i = 1; i < 10; i++) {
new Thread(()->{
map.put(Thread.currentThread().getName(),UUID.randomUUID().toString().substring(0,6));
System.out.println(Thread.currentThread().getName()+"\t"+map);
},String.valueOf(i)).start();
}
}
private static void setDemo() {
//Set<String> set = new HashSet<>();
Set<String> set = new CopyOnWriteArraySet<>();
for (int i = 1; i < 10; i++) {
new Thread(()->{
set.add(UUID.randomUUID().toString().substring(0,6));
System.out.println(Thread.currentThread().getName()+"\t"+set);
},String.valueOf(i)).start();
}
}
private static void listDemo() {
//List<String> list = new ArrayList();
List<String> list = new CopyOnWriteArrayList();
for (int i = 0; i < 10; i++) {
new Thread(()->{
list.add(UUID.randomUUID().toString().substring(0,6));
System.out.println(Thread.currentThread().getName() +"\t" + list);
},String.valueOf(i)).start();
}
}
}