本文主要研究一下Elasticsearch的ConcurrentMapLong

ConcurrentMapLong

elasticsearch-7.0.1/server/src/main/java/org/elasticsearch/common/util/concurrent/ConcurrentMapLong.java

public interface ConcurrentMapLong<T> extends ConcurrentMap<Long, T> {    T get(long key);    T remove(long key);    T put(long key, T value);    T putIfAbsent(long key, T value);}
  • ConcurrentMapLong继承了ConcurrentMap接口,并指定key类型为Long

ConcurrentHashMapLong

elasticsearch-7.0.1/server/src/main/java/org/elasticsearch/common/util/concurrent/ConcurrentHashMapLong.java

public class ConcurrentHashMapLong<T> implements ConcurrentMapLong<T> {    private final ConcurrentMap<Long, T> map;    public ConcurrentHashMapLong(ConcurrentMap<Long, T> map) {        this.map = map;    }    @Override    public T get(long key) {        return map.get(key);    }    @Override    public T remove(long key) {        return map.remove(key);    }    @Override    public T put(long key, T value) {        return map.put(key, value);    }    @Override    public T putIfAbsent(long key, T value) {        return map.putIfAbsent(key, value);    }    // MAP DELEGATION    @Override    public boolean isEmpty() {        return map.isEmpty();    }    @Override    public int size() {        return map.size();    }    @Override    public T get(Object key) {        return map.get(key);    }    @Override    public boolean containsKey(Object key) {        return map.containsKey(key);    }    @Override    public boolean containsValue(Object value) {        return map.containsValue(value);    }    @Override    public T put(Long key, T value) {        return map.put(key, value);    }    @Override    public T putIfAbsent(Long key, T value) {        return map.putIfAbsent(key, value);    }    @Override    public void putAll(Map<? extends Long, ? extends T> m) {        map.putAll(m);    }    @Override    public T remove(Object key) {        return map.remove(key);    }    @Override    public boolean remove(Object key, Object value) {        return map.remove(key, value);    }    @Override    public boolean replace(Long key, T oldValue, T newValue) {        return map.replace(key, oldValue, newValue);    }    @Override    public T replace(Long key, T value) {        return map.replace(key, value);    }    @Override    public void clear() {        map.clear();    }    @Override    public Set<Long> keySet() {        return map.keySet();    }    @Override    public Collection<T> values() {        return map.values();    }    @Override    public Set<Entry<Long, T>> entrySet() {        return map.entrySet();    }    @Override    public boolean equals(Object o) {        return map.equals(o);    }    @Override    public int hashCode() {        return map.hashCode();    }    @Override    public String toString() {        return map.toString();    }}
  • ConcurrentHashMapLong实现了ConcurrentMapLong接口,它内部使用ConcurrentMap实现

ConcurrentCollections

elasticsearch-7.0.1/server/src/main/java/org/elasticsearch/common/util/concurrent/ConcurrentCollections.java

public abstract class ConcurrentCollections {    static final int aggressiveConcurrencyLevel;    static {        aggressiveConcurrencyLevel = Math.max(Runtime.getRuntime().availableProcessors() * 2, 16);    }    //......    public static <K, V> ConcurrentMap<K, V> newConcurrentMap() {        return new ConcurrentHashMap<>();    }    public static <V> ConcurrentMapLong<V> newConcurrentMapLong() {        return new ConcurrentHashMapLong<>(ConcurrentCollections.<Long, V>newConcurrentMap());    }    public static <V> ConcurrentMapLong<V> newConcurrentMapLongWithAggressiveConcurrency() {        return new ConcurrentHashMapLong<>(ConcurrentCollections.<Long, V>newConcurrentMapWithAggressiveConcurrency());    }    public static <K, V> ConcurrentMap<K, V> newConcurrentMapWithAggressiveConcurrency() {        return newConcurrentMapWithAggressiveConcurrency(16);    }    public static <K, V> ConcurrentMap<K, V> newConcurrentMapWithAggressiveConcurrency(int initalCapacity) {        return new ConcurrentHashMap<>(initalCapacity, 0.75f, aggressiveConcurrencyLevel);    }        //......}
  • ConcurrentCollections提供了newConcurrentMapLong及newConcurrentMapLongWithAggressiveConcurrency两个静态方法用于创建ConcurrentMapLong;其中newConcurrentMapLongWithAggressiveConcurrency方法创建initalCapacity为16,loadFactor为0.75f,concurrencyLevel为aggressiveConcurrencyLevel(Math.max(Runtime.getRuntime().availableProcessors() * 2, 16))的ConcurrentHashMap

小结

  • ConcurrentMapLong继承了ConcurrentMap接口,并指定key类型为Long
  • ConcurrentHashMapLong实现了ConcurrentMapLong接口,它内部使用ConcurrentMap实现
  • ConcurrentCollections提供了newConcurrentMapLong及newConcurrentMapLongWithAggressiveConcurrency两个静态方法用于创建ConcurrentMapLong;其中newConcurrentMapLongWithAggressiveConcurrency方法创建initalCapacity为16,loadFactor为0.75f,concurrencyLevel为aggressiveConcurrencyLevel(Math.max(Runtime.getRuntime().availableProcessors() * 2, 16))的ConcurrentHashMap

doc

  • ConcurrentMapLong
  • ConcurrentHashMapLong
  • ConcurrentCollections