集合类不安全并发修改异常学习笔记

list

new arrayList<>();默认是容量10;
只要做过电商,金融等相关项目,必然会碰到一个异常(并发修改异常),java.util.ConcurrentModificationException。
如果让你说常见的几个异常,你其中说出了这个,那么你已经赢了,代表你肯定做过并发项目

故障现象

java.util.ConcurrentModificationException

故障原因

多个线程在操作集合时,引发的问题。,线程正在写,一个另一个线程也进行了操作。

解决方案

  • 面试时候回答加锁就炸了,还不如说用Vector。
    这个类其实也就是加了锁,但是这个回答很垃圾,因为就会导致并发性急剧下降。

  • 解决可以用Collections,他是这是Collection的工具类,这是个集合接口的辅助工具类;

    	//这就构造了一个线程安全的arrayList
    	Collections.synchronizedList(new ArrayList<>());
    

    示例代码
    在这里插入图片描述

  • 最重要的一个解决方式:CopyOnWriteArrayList<>()类
    写时复制,读写分离思想
    当某线程操作了一半,这时候新线程操作,将原来所有的数据全部复制,先将拷贝过来的集合加1,将新线程操作这个新扩容的,假如add操作就将新数据加到新扩容的位置,这就是新copy后的集合,然全部将引用操作这个新的集合。
    如下图,每个线程进行操作的时候,会将原来的进行拷贝,然后扩容用来存放性线程的操作,以此类推
    在这里插入图片描述

优化建议(不犯第二次)

由此可推断:map和set也是线程不安全。也可以用这个集合工具类来做

set的线程也是不安全

所有思想和list一样的,解决方案:
	这里用java.util.CopyOnWriteArraySet()类		===>面试说出这个比较好
	用Collections.synchronizedSet(new HashSet<>());

这里要知道hashset的底层就是一个标准的
hashmap,而增加值的时候,hashset为什么一个参数就行呢,如果他底层是hashmap不应该两个参数吗==>add的时候set的底层确实hashmap,只是add 时将key存入我们要存入的值而vulue则时一个object的恒定的值也就是说只关注的是可以,而value意义不大

map也是不安全的集合

解决方案:
ConcurrentHashMap<>();
也可以用Collections.synchronizedMap()来解决

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值