List<String> list = new ArrayList<String>();
for (int i = 0; i < 30; i++) {
new Thread(()->{
list.add(UUID.randomUUID().toString().substring(0, 8));
System.out.println(list);
},String.valueOf(i)).start(); ;
}
}
结果如下:
ConcurrentModificationException :当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。
并发争抢导致,参考花名册签名情况,一个人正在写入,另外一个同学过来抢夺,导致数据不一致异常,并发修改异常
CopyOnWrite 写时复制:
往一个容器添加元素的时候,不直接往当前容器Object[]添加,而是先将当前容器Object[]进行copy,只复制出一个新的容器object[] newelements;然后新的容器添加元素,添加完元素之后,再将原有容器的引用指向新的容器setArray(newelements);
这样的好处是可以对CopyOnWrite容器进行并发的读,而不需要枷锁,因为当前容器不会添加任何元素,所有CopyOnWrite容器也是一种读写分离的思想,读和写不同的容器
1.HashSet的底层是HasMap
public HashSet() {
map = new HashMap<>();
}
2.使用map的put方法存储,key存具体的值,value存Object对象
private static final Object PRESENT = new Object();
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
CopyOnWriteArrayList list;
CopyOnWriteArraySet set;
ConcurrentHashMap map;
我们知道ArrayList是线程不安全,请设计一个不安全的案例并给出解决方案?
原文:https://blog.51cto.com/liuyj/2667451