hashMap | concurrentHashmap | hashTable | |
---|---|---|---|
初始化 | 指定初始化大小数组 | 图1:需要考虑线程安全,调用initTable()。 判断sc变量是否小于0,如果不是则进行CAS抢占,将SIZECTL,sc赋值为-1。 其他线程进入时判断如果sizectl小于0,则进行yield()让出CPU执行权。 也就是说仅有一个线程能进行初始化操作。 | 指定大小 |
hash | 图2:高16位 异或^ 低16位取hash值 hash &(n-1) | ||
node | 内部维护hash值 | ||
PUT | 根据HASH判断下标,如果没有元素则CAS直接放入。 如果已经有元素 (synchronized 当前下标的头节点 f) 判断如果当前下标头节点hash == MOVED,那么就要去帮助搬运节点helpTransfer
| synchronized阻塞 | |
resize | 扩容线程:transfer(tab,null) 帮助线程:transfer(tab,f) 判断CPU核数 分配步数,取步数范围内数据进行迁移 |
图1:
图2: