1) ConcurrentHashMap 采用了分段锁技术,其中 Segment 继承于 ReentrantLock。不会像 HashTable 那样不管是 put 还是 get 操作都需要做同步处理,理论上 ConcurrentHashMap 支持 CurrencyLevel (Segment 数组数量)的线程并发。每当一个线程占用锁访问一个 Segment 时,不会影响到其他的 Segment
2)ConcurrentHashMap 的 get 方法是非常高效的,因为整个过程都不需要加锁。
3)[java 1.8] java 1.7的 ConcurrentHashMap存在的一个问题:遍历查询链表的效率太低
java 1.8 修改了底层的结构,抛弃了 1.7 原有的 Segment 分段锁,而采用了 CAS + synchronized 来保证并发安全性
4) 问题:
Java 1.8是怎么实现的 ConcurrentHashMap中 1.7存在的 遍历查询链表效率低的问题
答: 1.8 在 1.7 的数据结构上做了大的改动,采用红黑树之后可以保证查询效率(O(logn)),甚至取消了 ReentrantLock 改为了 synchronized,这样可以看出在新版的 JDK 中对 synchronized 优化是很到位的。
和 HashMap一样,引入了 链表太长时优化为 红黑树,查询效率从 O(n) 提高到了 O(logn)
5)常见问答题:
谈谈你理解的 HashMap,讲讲其中的 get put 过程。
1.8 做了什么优化?
是线程安全的嘛?
不安全会导致哪些问题?
如何解决?有没有线程安全的并发容器?
ConcurrentHashMap 是如何实现的? 1.7、1.8 实现有何不同?为什么这么做?