1、ConcurrentHashMap 是什么?它的工作原理是什么?
ConcurrentHashMap 是 Java 中的一个线程安全的散列表实现。与 HashMap 不同,ConcurrentHashMap 支持多个线程同时访问和修改散列表,而不需要任何额外的同步机制。
ConcurrentHashMap 的工作原理与 HashMap 类似,它使用哈希函数将键映射到桶索引位置,并使用链表或红黑树等数据结构解决哈希冲突。但是,ConcurrentHashMap 使用分段锁(segment lock)来限制同一时间只有一个线程可以修改特定的桶。
2、ConcurrentHashMap 与 HashMap 的区别是什么?
ConcurrentHashMap 和 HashMap 都是散列表实现,但它们之间有一些关键的区别。主要区别如下:
- 线程安全:ConcurrentHashMap 是线程安全的,而 HashMap 不是。
- 性能:在高并发的情况下,ConcurrentHashMap 的性能通常比 HashMap 更好,因为它允许多个线程同时访问散列表,而无需进行额外的同步。
- null 键和 null 值:ConcurrentHashMap 不支持 null 键和 null 值,而 HashMap 支持。
JDK1.7 | JDK1.8 | |
实现 | hashEntry+segment | Node+CAS+Synchronized |
锁 | Segment继承ReetrantLock | Synchronized |
存储 | 数组+链表 | 数组+链表+红黑树 |
链表超过8 | 数组 | 红黑树 |
插法 | 头插法 | 尾插法 |
3、ConcurrentHashMap 中的分段锁是什么?它如何确保线程安全?
ConcurrentHashMap 中的分段锁是一种锁的设计模式,它将散列表分成多个部分(段),每个部分都有一个独立的锁。当需要修改特定桶中的键值对时,只需锁定相应的段,而不是整个散列表。
由于每个段都有自己的锁,因此多个线程可以同时访问和修改不同的段,从而提高了并发性能。这确保了在任何时候只有一个线程可以修改同一段中的键值对,从而保证了线程安全。
4、ConcurrentHashMap 的扩容机制是什么?
ConcurrentHashMap 的扩容机制与 HashMap 类似,当存储在 ConcurrentHashMap 中的键值对的数量超过负载因子乘以散列表容量时,ConcurrentHashMap 将自动扩容。在扩容时,ConcurrentHashMap 会创建一个新的桶数组,并通过重新哈希化将所有键值对复制到新的桶中。与 HashMap 不同的是,ConcurrentHashMap 的扩容不会阻塞其他线程的访问。在扩容期间,ConcurrentHashMap 会将新的键值对添加到新的桶中,而不是旧的桶中。这确保了在扩容期间仍然可以进行并发访问。