ConcurrentHashMap 相关面试题
1.Hashtable和HashMap、ConcurrentHashMap 之间的区别?
- HashMap:线程不安全,key允许为null
- HashTable:线程安全,适用synchronized锁HashTable对象,效率较低,key不允许为null
- ConcurrentHashMap:线程安全,使用synchronized锁每个链表头结点,锁冲突概率低,充分利用CAS机制,优化了扩容方式,key不允许为null
2.ConcurrentHashMap的读是否需要加锁,为什么?
读操作没有加锁,只对写操作进行加锁。目的是为了进一步降低锁冲突的概率,为了保证读到刚修改的数据,搭配了volatile关键字。
3.介绍一下ConcurrentHashMap的锁分段技术?
目的也是为了降低锁竞争的概率,当两个线程访问的数据恰好在同一个段上的时候,才触发锁竞争。(这个是Java1.7中采取的技术,Java1.8中已经不再使用了,简单的说就是把若干个哈希桶分成一个“段”(Segment),针对每个段分别加锁)
4.ConcurrentHashMap在jdk1.8中做了哪些优化?
- 取消了分段锁,直接给每个哈希桶(每个链表)分配了一个锁(就是以每个链表的头结点对象作为锁对象)。
- 将原来数组+链表的实现方式改进成数组+链表/红黑树的方式,当链表较长时(大于等于8个元素)就转换成红黑树。