int c = segments[i].count; mcsum += mc[i] = segments[i].modCount; if (segments[i].containsValue(value)) { return true; segments[i].lock(); if (segments[i].containsValue(value)) { found = true; break; segments[i].unlock();
private boolean replaceInternal2(K key, int hash, V oldValue, V newValue) { removeStale(); HashEntry<K, V> e = getFirst(hash); while (e != null && (e.hash != hash || !keyEq(key, e.key()))) { e = e.next; } boolean replaced = false; if (e != null && oldValue.equals(e.value())) { replaced = true; e.setValue(newValue, valueType, refQueue); } return replaced; }
int c = segments[i].count; mcsum += mc[i] = segments[i].modCount; if (segments[i].containsValue(value)) { return true; segments[i].lock(); if (segments[i].containsValue(value)) { found = true; break; segments[i].unlock();
private V removeInternal(Object key, int hash, Object value, boolean refRemove) { if (!refRemove) { removeStale(); HashEntry<K, V> e = first; while (e != null && key != e.keyRef && (refRemove || hash != e.hash || !keyEq(key, e.key()))) { e = e.next; continue; newFirst = newHashEntry(pKey, p.hash, newFirst, p.value());
private V removeInternal(Object key, int hash, Object value, boolean refRemove) { if (!refRemove) { removeStale(); HashEntry<K, V> e = first; while (e != null && key != e.keyRef && (refRemove || hash != e.hash || !keyEq(key, e.key()))) { e = e.next; continue; newFirst = newHashEntry(pKey, p.hash, newFirst, p.value());
private V putInternal(K key, int hash, V value, IFunction<? super K, ? extends V> function, boolean onlyIfAbsent) { removeStale(); int c = count; int reduced = rehash(); HashEntry<K, V> first = tab[index]; HashEntry<K, V> e = first; while (e != null && (e.hash != hash || !keyEq(key, e.key()))) { e = e.next; resultValue = e.value(); if (!onlyIfAbsent) { e.setValue(getValue(key, value, function), valueType, refQueue); V v = getValue(key, value, function); resultValue = function != null ? v : null; tab[index] = newHashEntry(key, hash, first, v);
private V putInternal(K key, int hash, V value, IFunction<? super K, ? extends V> function, boolean onlyIfAbsent) { removeStale(); int c = count; int reduced = rehash(); HashEntry<K, V> first = tab[index]; HashEntry<K, V> e = first; while (e != null && (e.hash != hash || !keyEq(key, e.key()))) { e = e.next; resultValue = e.value(); if (!onlyIfAbsent) { e.setValue(getValue(key, value, function), valueType, refQueue); V v = getValue(key, value, function); resultValue = function != null ? v : null; tab[index] = newHashEntry(key, hash, first, v);
V applyIfPresent(K key, int hash, IBiFunction<? super K, ? super V, ? extends V> remappingFunction) { lock(); try { V oldValue = get(key, hash); if (oldValue == null) { return null; } V newValue = remappingFunction.apply(key, oldValue); if (newValue == null) { removeInternal(key, hash, oldValue, false); return null; } else { putInternal(key, hash, newValue, null, false); return newValue; } } finally { unlock(); } }
void clear() { if (count != 0) { lock(); try { HashEntry<K, V>[] tab = table; for (int i = 0; i < tab.length; i++) { tab[i] = null; } ++modCount; // replace the reference queue to avoid unnecessary stale cleanups refQueue = new ReferenceQueue<Object>(); // write-volatile count = 0; } finally { unlock(); } } } }
void clear() { if (count != 0) { lock(); try { HashEntry<K, V>[] tab = table; for (int i = 0; i < tab.length; i++) { tab[i] = null; } ++modCount; // replace the reference queue to avoid unnecessary stale cleanups refQueue = new ReferenceQueue<Object>(); // write-volatile count = 0; } finally { unlock(); } } } }
V applyIfPresent(K key, int hash, IBiFunction<? super K, ? super V, ? extends V> remappingFunction) { lock(); try { V oldValue = get(key, hash); if (oldValue == null) { return null; } V newValue = remappingFunction.apply(key, oldValue); if (newValue == null) { removeInternal(key, hash, oldValue, false); return null; } else { putInternal(key, hash, newValue, null, false); return newValue; } } finally { unlock(); } }
V get(Object key, int hash) { // read-volatile if (count != 0) { HashEntry<K, V> e = getFirst(hash); while (e != null) { if (e.hash == hash && keyEq(key, e.key())) { Object opaque = e.valueRef; if (opaque != null) { return e.dereferenceValue(opaque); } // recheck return readValueUnderLock(e); } e = e.next; } } return null; }