1、ConcurrenHashMap存储结构?
数组 + 链表 + 红黑树。
map.put(key,value);存储数据时,key-value会被封装成一个Node对象。
key的高低16为做异或运算,保证hash值足够散列。
(h ^ (h >>> 16)) & HASH_BITS
得出,当前Node对象需要放在数组的哪个索引位置上。
- 确认好索引位置,没数据,数据直接放数组上。
- 对应的索引位置有数据。
- 如果数组元素下面是链表,添加到链表的末尾。
- 如果数组元素下面是红黑树,走红黑树的逻辑。
2、ConcurrentHashMap如何保证写操作线程安全?
数据放在数组上,CAS保证安全。
数据放在链表/红黑树上,synchronized锁数组元素保证线程安全。
3、ConcurrentHashMap size()方法实现
基于LongAdder来保证线程安全的 ,LongAdder中 提供了CounterCell数组,每个CounterCell内部都有一个long类型的value属性,线程在做计数时,对CounterCell对象对内部的value做++操作。