江的福的小本本之集合类线程不安全

1、 Arraylist的线程不安全

众所周知,Arraylist是线程不安全的,它的add方法并没有加synchronized,那我们先来体验一下它的不安全。
在这里插入图片描述
在这里插入图片描述

现象: java.util.ConcurrentModificationException

那我们该如何解决这种不安全问题呢?
什么? 你说加锁?
亲,咱们来看看在这里插入图片描述
可以看到,Vector实现了List接口,再看add方法,可以看到synchronized.
但是vector是jdk1.0出现的,而Arraylist是,如果1.2,如果我们回答vector,是不是代表Arraylist就没有存在的必要?

在这里插入图片描述

vector可以保证一致性,但会使得并发性急剧下降。
除new Vector之外,再列举两种方法,
第一种是Collections.synchronizedList
List list = Collections.synchronizedList(new ArrayList<>());
而第二种就要说到写时复制(CopyOnWrite)了
撸源码:
在这里插入图片描述
关键的volatile看到了?在高并发的环境下使用volatile至关重要。
在这里插入图片描述
写时加锁先复制,修改之后才解锁。
读时不需要加锁,读写分离容器异。
在这里插入图片描述

2、Set的线程不安全

这里就不证明了,直接列举解决方法。
1、 Set set = Collections.synchronizedSet(new HashSet<>());
2、CopyOnWriteArraySet
Set set =new CopyOnWriteArraySet<>();
思想还是那个思想。不多说

插一句题外话,知道hashset 的底层是什么吗?
答对了,就是hashmap
在这里插入图片描述
但是为什么hashset 的add方法只需要一个参数呢?
在这里插入图片描述
在这里插入图片描述
PRESENT是固定的所以hashset 的add只需要一个参数

3、Map的线程不安全

1、 Map map =Collections.synchronizedMap(new HashMap<>());
2、Map map1 =new ConcurrentHashMap<>();

over!~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值