zoukankan      html  css  js  c++  java
  • 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;
  • 相关阅读:
    序列化与反序列化
    反射学习 :反射程序集
    转载 [TopLanguage]: 马一哥对开发“过程”的描述
    DNS域名规则
    Joel Spolsky: 好的界面设计应当符合用户预期
    开始在博客园中写博客
    2009牛年的答卷及2010虎年的题目
    Jenkins安装使用教程
    git第一次上传代码
    allure安装配置集成测试报告
  • 原文地址:https://www.cnblogs.com/wqff-biubiu/p/10537350.html
Copyright © 2011-2022 走看看