面试常问之concurrentHashMap
Posted 你这家伙
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试常问之concurrentHashMap相关的知识,希望对你有一定的参考价值。
像我们知道的Arraylist,LinkedList,HashMap,HashSet…都是线程不安全的,而Vector,Stack,HashTable是又是线程安全的
那么如果想在多线程下使用ArrayList怎么办呢?
方法:
- 自己加锁
- 使用synchronizedList
- 使用JUC里面的CopyOnWriteArrayList
如果想要在多线程下使用HashMap怎么办呢?
替代方法:
- HashTable(不太建议使用)
- ConcurrentHashMap(推荐使用)
这里我们就围绕面试来讲解,如:
- 理解hashMap.put(“Hello”,10)的执行过程(其实也是在问你hashMap是如何插入元素的)
这里得看hashMap的源码
总结:
- 先把key计算hash值,hash值就需要key具有hashCode方法
- 按照hash找到数组的具体元素
- 数组默认是个链表,把新的值构造节点,追加到链表之后即可
- 如果链表太长,就需要转换成红黑树
- 如果已经是红黑树,就按照红黑树的规则插入即可
- 插入完毕,要判断是否需要扩容(扩容能降低冲突率,提高效率)
- HashTable和concurrentHashMap的区别(concurrentHashMap有哪些特点)
HashTable 是一个线程安全的类,它使用synchronized来锁住整张Hash表来实现线程安全,即每次锁
住整张表让线程独占,相当于所有线程进行读写时都去竞争一把锁,导致效率非常低下。
ConcurrentHashMap可以做到读取数据不加锁,并且其内部的结构可以让其在进行写操作的时候能够将锁的粒度保持地尽量地小,允许多个修改操作并发进行,其关键在于使用了锁分离技术。它使用了多个锁来控制对hash表的不同部分进行的修改。只要不争夺同一把锁,它们就可以并发进行。(不像sychronized那样直接使用一把大锁,concurrentHashMap是使用若干个小锁(每个hash桶分配一个锁),降低锁冲突的概率)
(HashMap 则不是一个线程安全的类,完全不能用在多线程的场景下。)
常见面试题:
-
ConcurrentHashMap的读是否要加锁,为什么?
-
ConcurrentHashMap的锁分段技术?
-
ConcurrentHashMap的迭代器是强一致性的迭代器还是弱一致性的迭代器?
-
Mashmap和ConcurrentHashMap怎么确定key的唯一性?
-
HashTable和HashMap、ConcurrentHashMap?
-
ConcurrentHashMap的原理使用?
-
ConcurrentHashMap在jdk1.8做了哪些优化?
-
ConcurrentHashMap如何实现线程安全?
以上是关于面试常问之concurrentHashMap的主要内容,如果未能解决你的问题,请参考以下文章