ConcurrentMap原理详解
jdk1.8
数据结构
-
数组+链表+红黑树
-
Node<K,V>{}
static class Node<K,V> implements Entry<K,V> {
final int hash;
final K key;
volatile V val;
volatile Node<K,V> next;
如何线程安全
-
数组桶值设置和更新使用CAS算法
- tabAt(Node<K,V>[] tab, int i)
- casTabAt(Node<K,V>[] tab, int i, Node<K,V> c, Node<K,V> v)
- setTabAt(Node<K,V>[] tab, int i, Node<K,V> v)
-
针对链表和树更新使用Synchronize
设置putVal(K key, V value, boolean onlyIfAbsent)
-
1、数组为空,先初始化
-
2、tabAt获取桶位置元素,如果为空,则casTabAt(),期望值为null,新值为新节点
-
3、桶位置如果存在数据,说明hash冲突了,如果当前节点h