• 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

  • 相关阅读:
    代理匹配浅谈spring——自动创建代理(八)
    进程算法操作系统常见算法
    DTCoreText备忘
    内核用户态用户态和内核态的区别
    注释光标vim中如何快速去除注释# 或者 //字符
    方法执行[置顶] onPause()和onStop()的使用方法及注意事项
    录音函数网络对讲机C#服务器 Android客户端(二) C#服务器代码分析 附加
    匹配行linux中grep命令的使用
    最大整数NYOJ 44 字串和 370 巧克力 (最大连续字串和问题)
    行列方阵顺时针旋转
  • 原文地址:https://www.cnblogs.com/hujinshui/p/9950056.html
Copyright © 2020-2023  润新知