public V remove(Object key) { return replaceNode(key, null, null); }
/**
* Implementation for the four public remove/replace methods:
* Replaces node value with v, conditional upon match of cv if
* non-null. If resulting value is null, delete.
*/
final V replaceNode(Object key, V value, Object cv) {
//计算key经过扰动运算后的hash
int hash = spread(key.hashCode());
//自旋
for (Node<K,V>[] tab = table;;) {
//f表示桶位头结点
//n表示当前table数组长度
//i表示hash命中桶位下标
//fh表示桶位头结点 hash
Node<K,V> f; int n, i, fh;
//CASE1:
//条件一:tab == null true->表示当前map.table尚未初始化.. false->已经初始化
//条件二:(n = tab.length) == 0 true->表示当前map.table尚未初始化.. false->已经初始化
//条件三:(f = tabAt(tab, i = (n - 1) & hash)) == null true -> 表示命中桶位中为null,直接break, 会返回
if (tab == null || (n = tab.length) == 0 ||
(f = tabAt(tab, i = (n - 1) & hash)) == null)
break;
//CASE2:
//前置条件CASE2 ~ CASE3:当前桶位不是null
//条件成立:说明当前table正在扩容中,当前是个写操作,所以当前线程需要协助table完成扩容。
else if ((fh

本文详细解析了ConcurrentHashMap中remove方法的实现原理,包括其内部replaceNode方法的具体流程,涉及散列计算、自旋循环、同步锁使用、链表和红黑树节点处理等方面。
最低0.47元/天 解锁文章
1477

被折叠的 条评论
为什么被折叠?



