集合线程安全问题

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容器也是一种读写分离的思想,读和写不同的容器

猜你喜欢

转载自www.cnblogs.com/liuyi13535496566/p/12131197.html