并发之ConcurrentHashMap

常见的映射有HashMap,HashTable。
而HashMap是异步式线程不安全的映射,效率高,但是线程不安全。
HashTable呢,线程安全但是性能低。因为其中每个方法都加了同步代码块,在操作表的时候,会将整个表都锁起来。
所以引入了ConcurrentHashMap。它是一个异步式线程安全的映射。在它身上引入一个分段锁的机制,将整个表分为了16段,即16个segment,理论上的并发性能是HashTable的16倍。
Map底层采用的是散链表/哈希表(散列函数+数组)的数据结构。
一个key通过散列通过hash之后,对桶(这个桶就相当于是数组下标,数组是什么,是内存中一段连续的地址空间)取模,得到对应的散列地址。
因为采用散列的形式,就会产生冲突。
什么是冲突,就是a映射到了x位置,b也映射到x位置,给两个键分配了同一个位置。最简单的避免冲突的方式就是加链表,如果映射到同一个位置,就在这个位置添加一个链表。但是可能链表很长,可能很短。所以当查询一个值的时候,它最好的情况的时间复杂度就是O(1),最坏的情况的时间复杂度就是O(n)。
在平均情况下,散列表的查找(获取给定索引处的值)速度与数组一样快,而插入和删除速度与链表一样快,因此它兼具两者的优点!但在最糟情况下,散列表的各种操作的速度都很慢。因此,在使用散列表时,避开最糟情况至关重要。为此,需要避免冲突。而要避免冲突,需要有:
较低的加载因子;总的数据/桶的数量,尽量低的加载因子能够提高查询性能。
良好的散列函数。尽可能平均分配到桶中。
散列表有一个扩容机制,为了维持加载因子,进行翻倍扩容。初始容量为16 。扩容也要耗费内存,最好在创建的时候,给一个初始容量,避免多次扩容。
ConcurrentHashMap包含16个segment,每个segment都有一个散列表,默认的加载因子是0.75f,通过设置加载因子能够减少冲突,提高查询性能。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值