jdk1.8-ConcurrentHashMap源码

对着HashMap进行比较https://www.cnblogs.com/wqff-biubiu/p/8963817.html

ConcurrentHashMap与HashMap实现的接口

相同:AbstractMap,Serializable,Map----->可序列化的键值对

差别:ConcurrentHashMap比HashMap

  • 少实现了Cloneable接口---------不支持clone()
  • 多实现了ConcurrentMap接口------------重写并添加了部分方法

ConcurrentMap接口:

   @Override
    default V getOrDefault(Object key, V defaultValue) {}
    
    @Override
    default void forEach(BiConsumer<? super K, ? super V> action) {}
    
    V putIfAbsent(K key, V value);
    boolean remove(Object key, Object value);
    boolean replace(K key, V oldValue, V newValue);
    V replace(K key, V value);
    
    @Override
    default void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) {}
    
    @Override
    default V computeIfAbsent(K key,Function<? super K, ? extends V> mappingFunction) {}
    
    @Override
    default V computeIfPresent(K key,BiFunction<? super K, ? super V, ? extends V> remappingFunction) {}
    
    @Override
    default V compute(K key,BiFunction<? super K, ? super V, ? extends V> remappingFunction) {}
    
    @Override
    default V merge(K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction) {}

 ConcurrentHashMap变量与常量:

private static final int MAXIMUM_CAPACITY = 1 << 30;//最大容量,hash32位前两位为控制位
private static final int DEFAULT_CAPACITY = 16;//初始值0,首次put,默认扩容至16,之后扩容*2
static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;//虚拟机限制的最大数组长度
private static final int DEFAULT_CONCURRENCY_LEVEL = 16;//默认并发等级,没用但兼容早版本
private static final float LOAD_FACTOR = 0.75f;//加载因子,超过总容量*x扩容,通常不适用浮点值,用n>>>2表示,3>>>2==0.75
static final int TREEIFY_THRESHOLD = 8;//链表转化红黑树的阈值,链表节点大小超过8,转化为红黑树的条件之一
static final int UNTREEIFY_THRESHOLD = 6;//扩容时,红黑树转化为链表的阈值,红黑树节点小于6,转化为链表
static final int MIN_TREEIFY_CAPACITY = 64;//链表转化为红黑树的条件二,节点总数(键值对)需>64
private static final int MIN_TRANSFER_STRIDE = 16;
private static int RESIZE_STAMP_BITS = 16;
private static final int MAX_RESIZERS = (1 << (32 - RESIZE_STAMP_BITS)) - 1;
private static final int RESIZE_STAMP_SHIFT = 32 - RESIZE_STAMP_BITS;
static final int MOVED     = -1;
static final int TREEBIN   = -2;
static final int RESERVED  = -3;
static final int HASH_BITS = 0x7fffffff;
static final int NCPU = Runtime.getRuntime().availableProcessors();
transient volatile Node<K,V>[] table;
private transient volatile Node<K,V>[] nextTable;
private transient volatile long baseCount;
private transient volatile int sizeCtl;
private transient volatile int transferIndex;
private transient volatile int cellsBusy;
private transient volatile CounterCell[] counterCells;
private transient KeySetView<K,V> keySet;
private transient ValuesView<K,V> values;
private transient EntrySetView<K,V> entrySet;
private static final sun.misc.Unsafe U;
private static final long SIZECTL;
private static final long TRANSFERINDEX;
private static final long BASECOUNT;
private static final long CELLSBUSY;
private static final long CELLVALUE;
private static final long ABASE;
private static final int ASHIFT;

 

posted on 2019-03-15 15:24  FFStayF  阅读(208)  评论(0编辑  收藏  举报