http://m.blog.csdn.net/article/details?id=8960667
这篇文章第二点,关于删除指定key对应entry,不是线程安全的?为什么?看不太明白
http://m.blog.csdn.net/article/details?id=8960667
这篇文章第二点,关于删除指定key对应entry,不是线程安全的?为什么?看不太明白
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;
}
如果两个线程同时进入这个方法,取得的i值相等的时候,一个线程的处理结果会被另一个处理结果覆盖。
15 回答8.2k 阅读
8 回答6k 阅读
1 回答4.1k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答3.2k 阅读
2 回答3.9k 阅读
1 回答2.2k 阅读✓ 已解决
我大致看了下,我的理解是这样的。
原文说当多个线程操作同一个数组位置,有可能是这样一种情况,比如两个线程,线程A要删除节点A,线程B要删除节点B,正好节点A和节点B都在同一个数组位置的链表中,然后两个线程都拿到了这个相同的数组位置,假设这个位置的链表是这样的header->A->B->C,那么线程A要做的是把header指向节点B就把节点A删掉了;线程B呢,是要把节点A指向节点C就把节点B删掉了;如果线程B先执行,线程A再执行,会发现节点B本来被线程B删掉了,然后又被线程A给弄回来了。