2 回答

TA貢獻(xiàn)1887條經(jīng)驗 獲得超5個贊
我大致看了下,我的理解是這樣的。
當(dāng)多個線程同時操作同一個數(shù)組位置的時候,也都會先取得現(xiàn)在狀態(tài)下該位置存儲的頭結(jié)點,然后各自去進(jìn)行計算操作,之后再把結(jié)果寫會到該數(shù)組位置去,其實寫回的時候可能其他的線程已經(jīng)就把這個位置給修改過了,就會覆蓋其他線程的修改
原文說當(dāng)多個線程操作同一個數(shù)組位置,有可能是這樣一種情況,比如兩個線程,線程A要刪除節(jié)點A,線程B要刪除節(jié)點B,正好節(jié)點A和節(jié)點B都在同一個數(shù)組位置的鏈表中,然后兩個線程都拿到了這個相同的數(shù)組位置,假設(shè)這個位置的鏈表是這樣的header->A->B->C,那么線程A要做的是把header指向節(jié)點B就把節(jié)點A刪掉了;線程B呢,是要把節(jié)點A指向節(jié)點C就把節(jié)點B刪掉了;如果線程B先執(zhí)行,線程A再執(zhí)行,會發(fā)現(xiàn)節(jié)點B本來被線程B刪掉了,然后又被線程A給弄回來了。

TA貢獻(xiàn)1831條經(jīng)驗 獲得超9個贊
final Entry<K,V> removeEntryForKey(Object key) {
int hash = (key == null) ? 0 : hash(key.hashCode());
int i = indexFor(hash, table.length);
Entry<K,V> prev = table[i];
Entry<K,V> e = prev;
while (e != null) {
Entry<K,V> next = e.next;
Object k;
if (e.hash == hash &&
((k = e.key) == key || (key != null && key.equals(k)))) {
modCount++;
size--;
if (prev == e)
table[i] = next;
else
prev.next = next;
e.recordRemoval(this);
return e;
}
prev = e;
e = next;
}
return e;
}
如果兩個線程同時進(jìn)入這個方法,取得的i值相等的時候,一個線程的處理結(jié)果會被另一個處理結(jié)果覆蓋。
添加回答
舉報