ArrayList,HashSet在多线程下会有线程安全问题,会抛java.util.ConcurrentModifycationException
导致原因就是:
并发争抢导致,例如一个人正在写入,另一个人来抢夺,导致数据不一致异常,并发修改异常。
解决ArrayList线程安全问题方案
List<String> list = new Vector<>(); 方案1
List<String> list = Collections.synchronizedList(new ArrayList<>()); 方案2
List<String> list = new CopyOnWriteArrayList; 方案3 juc下面的
解决HashSet线程安全问题方案
Set<String> list = Collections.synchronizedSet(new HashSet<>()); 方案1
List<String> list = new CopyOnWriteArraySet; 方案2 juc下面的 ,其中,CopyOnWriteArraySet类的构造器调用的还是new CopyOnWriteArrayList()
下面看CopyOnWriteArrayList
add底层源码,写时复制,读写分离思想
大概意思是,先加锁,往一个容器添加元素的时候,不直接往当前容器Object[]添加,而是先将当前容器Oject[]进行copy,复制出一个新的容器Objcet[] newElements里添加元素,添加完成元素之后,再将原容器的引用指向新的容器setArray(newElements),这样做的好处是可以对CopyOnWrite容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素。所以CopyOnWrite容器也是一种读写分离的思想,读和写不同的容器