в ConcurrentHashMap
if ((f = tabAt(tab, i = (n - 1) & h)) == null) {
Node<K,V> r = new ReservationNode<K,V>();
synchronized (r) {
if (casTabAt(tab, i, null, r)) {
binCount = 1;
Node<K,V> node = null;
try {
if ((val = remappingFunction.apply(key, null)) != null) {
delta = 1;
node = new Node<K,V>(h, key, val);
}
} finally {
setTabAt(tab, i, node);
}
}
}
if (binCount != 0)
break;
}
в каждом потоке новый объект-монитор Node<K,V> r = new ReservationNode<K,V>();, то есть синхры по факту нет ?
Тебя реалньо не смущает простыня которую ты выложил?
из метода compute() в ConcurrentHashMap большую часть можно не копипастить Node<K,V> r = new ReservationNode<K,V>(); synchronized (r) { .... } Как оно работает, блин
https://stackoverflow.com/a/26482906/1756750
спасибо... ща почитаю!
Обсуждают сегодня