java面试之ConcurrentHashMap

ConcurrentHashMap

Segment段

ConcurrentHashMap和HashMap思路差不多的,但是因为他支持并发操作,所以要复杂一些,整个ConcurrentHashMap由一个个Segment组成,Segment代表“部分” 或者“一段”的意思,所以很多地方都会将其描述为 分段锁。

线程安全(Segment继承ReentrantLock加锁)

简单理解就是,ConcurrentHashMap是一个segment数组,segment通过继承ReentrantLock来进行加锁,所以每次需要加锁的操作锁住的是一个segment,这样只要保证每个segment是线程安全的,也就实现了全局的线程安全。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XIZz9QmE-1594910556335)(/image-20200716194345265.png)]

并行度(默认16)

concurrentLevel:并行级别,并发数,segment数。默认16.

也就是说ConcurrentHashMap有16个Segment,所以理论上,这个时候,最多可以同时支持16个线程并发写,只要他们的操作分别分布在不同的segment上,这个值可以在初始化的时候设置为其他值,但是一旦初始化后,它是不可以扩容的。再具体到每个segment内部,其实每个segment很像之前介绍的HashMap,不过它要保证线程安全,所以处理起来要麻烦些。

Java8 实现 (引入了红黑树)
Java8 对 ConcurrentHashMap 进行了比较大的改动,Java8 也引入了红黑树。
在这里插入图片描述

Hashtable(线程安全)

Hashtable是遗留类,很多映射的常用功能与HashMap类似,不同的是它继承自Dictinary类,

并且是线程安全的,任意时刻只有一个线程能写Hashtable,并发性不如ConcurrentHashMap,因为ConcurrentHashMap引入了分段锁。Hashtable不建议在新代码中使用,不需要线程安全的场合可以用HashMap替换,需要线程安全的场合使用ConcurrentHashMap替换。

需要线程安全的场合使用ConcurrentHashMap替换。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值