ConcurrentHashMap

Concurrent是同时的意思

相对于HashTable和Collections.synchronizedMap(),ConcurrentHashMap能够在线程安全的基础上提供更好的并操作。同时降低对读的一致性要求。

jdk6、7、8都不同

1、jdk6/7的的实现

设计思路:采用分段锁的设计,而HashTable是对整个map加锁性能下降。ConcurrentHashMap是对某个部分加锁。

but,由于不是对整个Map加锁,导致一些需要扫描整个Map的方法(如size(), containsValue())需要使用特殊的实现,另外一些方法(如clear())甚至放弃了对一致性的要求(ConcurrentHashMap是弱一致性的

并发度:就是程序同时更新map不产生所得最大线程数,默认是16,一般是2的次方数。不能多不能少,也就是提升了16倍

就是把大Map拆分成N个Segment类似HashTable了

源码分析:

concurrencylevel默认是16个段(Segment)

每个Segment都是独立的,支持并发

get方法不需要加锁,因为是用volatile来保证可读性的

2、jdk8的实现

变动很大,不用锁段了,利用synchronized和CAS算法,底层是数组+链表+红黑树,为了满足并发又增加了很多辅助的类,例如TreeBin,Traverser等对象内部类。

数据结构: synchronized和CAS+Node+红黑树,node的val和next都用volatile来保障可见性,查找替换赋值用 cas

和HashTable区别:不能别取代,两者的迭代器不同,HashTable是强一致性,而ConcurrentHashMap是弱一致性。包括get/clear/iterator都是弱的

什么是弱一致性?

put完成之后不能,get需要等待一段时间。

问题:

(1)ConcurrentHashMap的锁分段技术

(2)ConcurrentHashMap的读是否要加锁,为什么

不需要加锁,put加锁了,get不需要

(3)ConcurrentHashMap的迭代器是强一致性的迭代器还是弱一致性的迭代器

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值