JDK1.8 ConcurrentHashMap:
数据结构跟HashMap1.8的结构一样,数组+链表/红黑二叉树。除此以外,采用CAS和synchronized来保证并发安全。synchronized只锁定当前链表或红黑二叉树的首节点,这样只要hash不冲突,就不会产生并发,效率又提升N倍。
Put:
- 判断Node[]数组是否初始化,没有则进行初始化操作
2.通过hash定位Node[]数组的索引坐标,是否有Node节点,如果没有则使用CAS进行添加(链表的头结点),添加失败则进入下次循环。
3.检查到内部正在扩容,如果正在扩容,就帮助它一块扩容。
4.如果f!=null,则使用synchronized锁住f元素(链表/红黑二叉树的头元素)
4.1如果是Node(链表结构)则执行链表的添加操作。
4.2如果是TreeNode(树型结果)则执行树添加操作。
5.判断链表长度已经达到临界值8 就需要把链表转换为树结构。
Get: