我阅读了Brian Goetz关于ConcurrentHashMap的this优秀文章。但是当我在最近的java版本(1.8)中查看ConcurrentHashMap的代码时,我注意到了一些差异
MapEntry中的下一个指针不是final,而是volatile,因此可以在中间修改列表,而不仅仅是开始。
static class Node<K,V> implements Map.Entry<K,V> {
final int hash;
final K key;
volatile V val;
volatile Node<K,V> next;
此外,在初始迭代中无法查找密钥时,我也看不到get方法在哪里获取锁定
public V get(Object key) {
Node<K,V>[] tab; Node<K,V> e, p; int n, eh; K ek;
int h = spread(key.hashCode());
if ((tab = table) != null && (n = tab.length) > 0 &&
(e = tabAt(tab, (n - 1) & h)) != null) {
if ((eh = e.hash) == h) {
if ((ek = e.key) == key || (ek != null && key.equals(ek)))
return e.val;
}
else if (eh < 0)
return (p = e.find(h, key)) != null ? p.val : null;
while ((e = e.next) != null) {
if (e.hash == h &&
((ek = e.key) == key || (ek != null && key.equals(ek))))
return e.val;
}
}
return null;
}
有人可以解释一下get方法中获取锁的方式和位置,如果有的话?