面试题答案
一键面试数据结构设计优化
- 分段数组结构:ConcurrentHashMap 采用了类似于“分段锁”的设计,内部由多个 Segment 组成,每个 Segment 类似于一个小型的 HashMap。每个 Segment 有自己独立的锁,这样不同 Segment 上的操作可以并发执行,减小锁的粒度,提高并发度。
- 链表与红黑树结合:每个 Segment 内部的数据结构采用数组 + 链表(JDK 1.8 之前),在 JDK 1.8 及之后,当链表长度超过一定阈值(默认为 8)时,链表会转换为红黑树。红黑树的引入提高了查找、插入和删除操作的效率,尤其是在数据量较大时,避免链表过长导致的性能问题。
锁机制应用优化
- 减小锁粒度:通过分段设计,每个 Segment 独立加锁,使得在多线程环境下,不同线程可以同时访问不同的 Segment,只有在访问同一 Segment 时才需要竞争锁,相比对整个哈希表加锁,大大减少了锁竞争的可能性,提高了并发性能。
- 锁分离:读操作基本无锁,ConcurrentHashMap 使用了 volatile 修饰的数组和 Node 节点来保证数据的可见性,读操作可以直接读取数据而不需要加锁,只有在写操作(如插入、删除等)时才需要获取相应 Segment 的锁,实现了读写操作的锁分离,进一步提高并发效率。
- 锁升级优化:在 JDK 1.8 中,锁的实现从 Segment 分段锁改为 CAS(Compare and Swap)无锁操作 + synchronized 同步锁机制。对于一些简单的操作,首先尝试使用 CAS 无锁操作来更新数据,只有在 CAS 操作失败时,才会使用 synchronized 同步锁,这种机制在高并发场景下,减少了锁竞争的开销,提高了性能。