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