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的迭代器是强一致性的迭代器还是弱一致性的迭代器