concurrentHashMap是一个并发的map类,利用cas,Unsafe技术提供更细腻的并发控制,得到更好的并发效果
1.8之前特性
特点:
- 锁分段;concurrentcyLevel默认值是16;通过锁定segment来实现同步;相比hashtable,进步很大.但初始化很慢;
- entry的value值加volatile,保证可见性
- putVal()方法重复扫描,检测冲突,获取再入锁; 锁的是segment,粒度还是有点大.
- size统计,根据Segment.modcount值进行重试,不成功则锁定;综合统计;实际上不是很好
- get()方法利用了Unsafe.getOjbectVolatile(Object[],long n)方法
- resize() 针对segment进行扩容
1.8
特性:
- 去掉segment,直接对Entry加锁;实际上新增的锁是加在链表头或树头上的
- putVal时,使用synchronize锁定entry值,更新时采用Unsafe的CAS技术更新
- Entry的value和之前没变化
- size统计,合并统计, CounterCells,采用CounterCell类,使用LongAdder技术
- 初始化,双检锁+cas技术进行控制;
- 取值是,利用(Node)U.getObjectAcquire(Object[],long n)技术
- resize() 同样有树化操作