ConcurrentHashMap与CopyOnWriteArrayList比较。

本文深入探讨了ConcurrentHashMap和CopyOnWriteArrayList两种并发集合的特点及其实现原理。ConcurrentHashMap通过Segment机制实现锁分离,提高并发访问性能,但部分操作难以保证准确性。CopyOnWriteArrayList则适用于读多写少的场景,利用写时复制策略确保读取操作的安全。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ConcurrentHashMap
ConcurrentHashMap引入了Segment,每个Segment又是一个hashtable,相当于是两级Hash表,然后锁是在Segment一级进行的,提高了并发性。缺点是对整个集合进行操作的方法如 size() 或 isEmpty()的实现很困难,基本无法得到精准的数据。Segment的read不加锁,只有在读到null的情况(一般不会有null的,只有在其他线程操作Map的时候,所以就用锁来等他操作完)下调用了readValueUnderLock。数据存储是采用hash表的方式将元素分布在各bucket之间,当遍历一个hash表的bucket以期找到某一特定的key时, get() 必须对大量的候选bucket调用 Object.equals() 。如果key类所使用的 hashCode() 函数不能将value均匀地分布在整个hash表范围内,或者存在大量的hash冲突,那么某些bucket链就会比其他的链长很多,而遍历一个长的hash链以及对该hash链上一定百分比的元素调用 equals() 是一件很慢的事情,所以会影响迭代效率。

CopyOnWriteArrayList
CopyOnWriteArrayList是ArrayList 的一个线程安全的变体,ArrayList实现了RandomAccess接口,表明其支持快速的随机访问。读的时候就是在引用的当前对象上进行读(包括get,iterator等),不存在加锁和阻塞,针对iterator使用了一个叫COWIterator 的阉割版迭代器,因此不支持写操作,当获取CopyOnWriteArrayList的迭代器时,是将迭代器里的数据引用指向当前引用指向的数据对象,无论未来发生什么写操作,都不会再更改迭代器里的数据对象引用,所以迭代器也很安全。CopyOnWriteArrayList中写操作需要大面积复制数组,所以性能肯定很差,读操作和写操作针对的不是同一个对象,所以读之间也不需要加锁,读和写之间的同步处理只是在写完后通过一个简单的“=”将引用指向新的数组对象上来。适合使用在读操作远远大于写操作的场景。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值