concurrentHashMap面试题

面试题:面试

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

一、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

 

二、ConcurrentHashMap使用什么技术来保证线程安全?数据结构

 

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

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

 

三、ConcurrentHashMap的get方法是否要加锁,为何?函数

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

 

四、ConcurrentHashMap迭代器是强一致性仍是弱一致性?HashMap呢?spa

弱一致性,hashmap强一直性。线程

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

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

 

五、ConcurrentHashMap1.7和1.8的区别:

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

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

相关文章
相关标签/搜索