performance: make isEmpty() allocate-free

This commit is contained in:
Alexey Kudravtsev
2017-08-14 16:41:40 +03:00
parent df6d859da5
commit 2c417a660f
3 changed files with 18 additions and 17 deletions
@@ -126,7 +126,7 @@ abstract class ConcurrentRefHashMap<K, V> extends AbstractMap<K, V> implements C
@Override
public boolean isEmpty() {
return entrySet().isEmpty();
return myMap.isEmpty();
}
@Override
@@ -355,8 +355,9 @@ abstract class ConcurrentRefHashMap<K, V> extends AbstractMap<K, V> implements C
@NotNull
@Override
public Set<Map.Entry<K, V>> entrySet() {
if (entrySet == null) entrySet = new EntrySet();
return entrySet;
Set<Entry<K, V>> es = entrySet;
if (es == null) entrySet = es = new EntrySet();
return es;
}
@Override
@@ -202,7 +202,7 @@ abstract class RefHashMap<K, V> extends AbstractMap<K, V> implements Map<K, V> {
@Override
public boolean isEmpty() {
return entrySet().isEmpty();
return myMap.isEmpty();
}
@Override
@@ -21,11 +21,11 @@ import java.lang.ref.ReferenceQueue;
import java.util.*;
abstract class RefKeyRefValueHashMap<K,V> implements Map<K,V>{
private final RefHashMap<K, ValueReference<K,V>> myWeakKeyMap;
private final RefHashMap<K, ValueReference<K,V>> myMap;
private final ReferenceQueue<V> myQueue = new ReferenceQueue<V>();
RefKeyRefValueHashMap(@NotNull RefHashMap<K, ValueReference<K, V>> weakKeyMap) {
myWeakKeyMap = weakKeyMap;
myMap = weakKeyMap;
}
protected interface ValueReference<K, V> {
@@ -43,12 +43,12 @@ abstract class RefKeyRefValueHashMap<K,V> implements Map<K,V>{
// returns true if some refs were tossed
boolean processQueue() {
boolean processed = myWeakKeyMap.processQueue();
boolean processed = myMap.processQueue();
while(true) {
ValueReference<K,V> ref = (ValueReference<K, V>)myQueue.poll();
if (ref == null) break;
RefHashMap.Key<K> weakKey = ref.getKey();
myWeakKeyMap.removeKey(weakKey);
myMap.removeKey(weakKey);
processed = true;
}
return processed;
@@ -56,23 +56,23 @@ abstract class RefKeyRefValueHashMap<K,V> implements Map<K,V>{
@Override
public V get(Object key) {
ValueReference<K,V> ref = myWeakKeyMap.get(key);
ValueReference<K,V> ref = myMap.get(key);
return dereference(ref);
}
@Override
public V put(K key, V value) {
processQueue();
RefHashMap.Key<K> weakKey = myWeakKeyMap.createKey(key);
RefHashMap.Key<K> weakKey = myMap.createKey(key);
ValueReference<K, V> reference = createValueReference(weakKey, value, myQueue);
ValueReference<K,V> oldRef = myWeakKeyMap.putKey(weakKey, reference);
ValueReference<K,V> oldRef = myMap.putKey(weakKey, reference);
return dereference(oldRef);
}
@Override
public V remove(Object key) {
processQueue();
ValueReference<K,V> ref = myWeakKeyMap.remove(key);
ValueReference<K,V> ref = myMap.remove(key);
return dereference(ref);
}
@@ -83,18 +83,18 @@ abstract class RefKeyRefValueHashMap<K,V> implements Map<K,V>{
@Override
public void clear() {
myWeakKeyMap.clear();
myMap.clear();
processQueue();
}
@Override
public int size() {
return myWeakKeyMap.size(); //?
return myMap.size(); //?
}
@Override
public boolean isEmpty() {
return myWeakKeyMap.isEmpty(); //?
return myMap.isEmpty();
}
@Override
@@ -110,14 +110,14 @@ abstract class RefKeyRefValueHashMap<K,V> implements Map<K,V>{
@NotNull
@Override
public Set<K> keySet() {
return myWeakKeyMap.keySet();
return myMap.keySet();
}
@NotNull
@Override
public Collection<V> values() {
List<V> result = new ArrayList<V>();
final Collection<ValueReference<K, V>> refs = myWeakKeyMap.values();
final Collection<ValueReference<K, V>> refs = myMap.values();
for (ValueReference<K, V> ref : refs) {
final V value = ref.get();
if (value != null) {