作者:zc43pml | 来源:互联网 | 2023-10-10 18:15
这边分析的是JDK1.7版本的hashmap核心代码是这voidtransfer(Entry[]newTable,booleanrehash){intnewCapacitynewT
这边分析的是JDK1.7版本的hashmap
核心代码是这
void transfer(Entry[] newTable, boolean rehash) {int newCapacity &#61; newTable.length;for (Entry<K,V> e : table) {while(null !&#61; e) {Entry<K,V> next &#61; e.next; ---------------------(1)if (rehash) {e.hash &#61; null &#61;&#61; e.key ? 0 : hash(e.key);}int i &#61; indexFor(e.hash, newCapacity); e.next &#61; newTable[i];newTable[i] &#61; e;e &#61; next;} }}
其中关键的地方
next &#61; e.next;
e.next &#61; newTable[i];
newTable[i] &#61; e;e &#61; next;
线程A和线程B同时触发了扩容&#xff0c;线程B正常完成扩容后&#xff0c;会修改了e.next的引用关系&#xff0c;导致线程A读到错误的引用关系
接着线程A继续执行