Hash集合

本文比较了HashSet的无序性、不允许重复元素、基于哈希表的高效操作以及非线程安全特点,同时详细解释了ConcurrentHashMap在Java1.8前后线程安全实现的变化,从细粒度锁到分段锁以降低锁竞争,提升并发性能。
摘要由CSDN通过智能技术生成

1.HashSet集合的特点包括:

无序性:HashSet集合中的元素是无序的,即元素的存储顺序与元素被添加到集合中的顺序不一致。

不允许重复元素:HashSet集合中不允许存储重复的元素,即相同的元素只能保存一次。

底层实现为哈希表:HashSet集合内部使用哈希表来存储元素,它依赖于元素的hashCode()方法来计算元素在哈希表中的存储位置。

允许存储null值:HashSet集合允许存储null值,但只能存储一个null值,如果重复添加null值,则只会保存一次。

迭代顺序不确定:由于HashSet集合是无序的,因此在使用迭代器遍历HashSet集合时,元素的返回顺序是不确定的。

高效的插入和查找操作:由于HashSet集合的底层实现为哈希表,故插入和查找操作的时间复杂度都是O(1)。

不是线程安全的:HashSet集合不是线程安全的,在并发环境下,需要使用Collections的synchronizedSet()方法来确保安全访问

2.ConcurentHashMap的线程安全

ConcurrentHashMap在1.8之前的实现通过使用锁来实现线程安全。在每一个桶(bucket)上都有一个锁,当某个线程在访问某个桶中的元素时,该桶会被锁定,其他线程在访问该桶时需要等待。这种粒度较细的锁机制可以提供较高的并发性能,但在高并发情况下可能引发锁竞争问题,并导致性能下降。

而在1.8之后的实现中,ConcurrentHashMap引入了一种新的并发度分段锁(Segment-Based Locking)的机制。ConcurrentHashMap被分为了多个段(Segment),每个段都类似于一个独立的小型ConcurrentHashMap,维护着自己的Hash表。每个段都有自己的锁,不同的段之间互相独立,这样不同的线程在访问不同的段时可以并行进行,提高了并发性能,并减少了锁竞争的概率。在1.8之后的ConcurrentHashMap中,获取锁的粒度变大了,相比于1.8之前的实现,降低了锁竞争的概率,提高了并发性能。

总结来说,1.8之前的ConcurrentHashMap通过细粒度的锁实现线程安全,但在高并发情况下容易导致锁竞争问题。而1.8之后的ConcurrentHashMap引入了分段锁机制,将整个集合分为多个段,每个段拥有独立的锁,提高了并发性能并降低了锁竞争的概率。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值