• concurrentHashMap面试题


    面试题:

    1. ConcurrentHashMap有哪些构造函数?
    2. ConcurrentHashMap使用什么技术来保证线程安全?
    3. ConcurrentHashMap的get方法是否要加锁,为什么?
    4. ConcurrentHashMap迭代器是强一致性还是弱一致性?HashMap呢?
    5. ConcurrentHashMap1.7和1.8的区别;

    1、ConcurrentHashMap有哪些构造函数?

    一共有五个,作用及代码如下:

        //无参构造函数
        public ConcurrentHashMap() {
        }
        //可传初始容器大小的构造函数
        public ConcurrentHashMap(int initialCapacity) {
            if (initialCapacity < 0)
                throw new IllegalArgumentException();
            int cap = ((initialCapacity >= (MAXIMUM_CAPACITY >>> 1)) ?
                       MAXIMUM_CAPACITY :
                       tableSizeFor(initialCapacity + (initialCapacity >>> 1) + 1));
            this.sizeCtl = cap;
        }
        //可传入map的构造函数
        public ConcurrentHashMap(Map<? extends K, ? extends V> m) {
            this.sizeCtl = DEFAULT_CAPACITY;
            putAll(m);
        }
        //可设置阈值和初始容量
        public ConcurrentHashMap(int initialCapacity, float loadFactor) {
            this(initialCapacity, loadFactor, 1);
        }
    
        //可设置初始容量和阈值和并发级别
        public ConcurrentHashMap(int initialCapacity,
                                 float loadFactor, int concurrencyLevel) {
            if (!(loadFactor > 0.0f) || initialCapacity < 0 || concurrencyLevel <= 0)
                throw new IllegalArgumentException();
            if (initialCapacity < concurrencyLevel)   // Use at least as many bins
                initialCapacity = concurrencyLevel;   // as estimated threads
            long size = (long)(1.0 + (long)initialCapacity / loadFactor);
            int cap = (size >= (long)MAXIMUM_CAPACITY) ?
                MAXIMUM_CAPACITY : tableSizeFor((int)size);
            this.sizeCtl = cap;
        }
    View Code

    2、ConcurrentHashMap使用什么技术来保证线程安全?

    jdk1.7:Segment+HashEntry来进行实现的;

    jdk1.8:放弃了Segment臃肿的设计,采用Node+CAS+Synchronized来保证线程安全;

    3、ConcurrentHashMap的get方法是否要加锁,为什么?

    不需要,get方法采用了unsafe方法,来保证线程安全。

    4、ConcurrentHashMap迭代器是强一致性还是弱一致性?HashMap呢?

    弱一致性,hashmap强一直性。

    ConcurrentHashMap可以支持在迭代过程中,向map添加新元素,而HashMap则抛出了ConcurrentModificationException,

    因为HashMap包含一个修改计数器,当你调用他的next()方法来获取下一个元素时,迭代器将会用到这个计数器。

    5、ConcurrentHashMap1.7和1.8的区别:

    jdk1.8的实现降低锁的粒度,jdk1.7锁的粒度是基于Segment的,包含多个HashEntry,而jdk1.8锁的粒度就是Node

    数据结构:jdk1.7 Segment+HashEntry;jdk1.8 数组+链表+红黑树+CAS+synchronized

  • 相关阅读:
    mysqladmin命令的用法
    利用cacti监控多端口memcache
    Msyqlproxy的编译安装
    eclipse下SVN subclipse插件
    Asp.net SqlDataSource用法 插入 更新 删除
    C#的匿名方法
    MDHH使用图解
    SVN入门及配置使用(多平台)
    编写Windows Live Writer插件(1)
    防止事件冒泡
  • 原文地址:https://www.cnblogs.com/hujinshui/p/9950056.html
Copyright © 2020-2023  润新知