ArrayList
不是线程安全类,在多线程同时写的情况下,会抛出java.util.ConcurrentModificationException
异常。
public class ContainerNotSafeDemo {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
for (int i = 1; i <=10;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.解决方案
* 3.1 使用Vector--1.0就有,ArrayList 1.2才有。--并发性急剧下降
* 3.2 Collections集合接口的辅助工具类,
* List<String> list=Collections.synchronizedList(new ArrayList())
* 3.3 CopyOnwrite---推荐,写时复制
* List<String> list=new CopyOnWriteArrayList<>();
*
* 4.优化建议
*/
}
}
CopyOnWriteArrayList
实现读写分离。
public boolean add(E e) {
final ReentrantLock lock = this.lock;
lock.lock();
try {
//得到旧数组
Object[] elements = getArray();
int len = elements.length;
//复制新数组
Object[] newElements = Arrays.copyOf(elements, len + 1);
//设置新元素
newElements[len] = e;
//设置新数组
setArray(newElements);
return true;
} finally {
lock.unlock();
}
}