Java 集合面试题, Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别?
Java 集合面试题, Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别?
QA
Step 1
Q:: Java 中 ConcurrentHashMap 1.7 和 1.8
之间有哪些区别?
A:: 在 Java 7 中,ConcurrentHashMap 使用了分段锁(Segment),每个 Segment 是一个独立的哈希表,并且拥有自己的锁。在 Java 8 中,ConcurrentHashMap 使用了更加精细的锁(CAS 操作和内置锁)来实现,并且引入了红黑树来优化高冲突情况下的性能。具体区别包括:1.7 版本使用 Segment 锁,1.8 版本使用 CAS 和 synchronized 来减少锁的粒度;1.8 版本引入了红黑树,在节点过多时优化查询性能;1.8
版本的实现更简单、性能更高。
Step 2
Q:: ConcurrentHashMap 如何确保线程安全?
A:: ConcurrentHashMap 通过多种机制来确保线程安全:1.7 版本使用分段锁,每个 Segment 是一个独立的锁,减少了锁竞争;1.8 版本则使用了更细粒度的锁和 CAS 操作,使得在并发操作下冲突更少。此外,1.8
版本还引入了红黑树来优化性能,在写入时,通过 synchronized 锁来保证安全性,在读取时则使用 volatile 和 CAS 来保证最新数据的可见性。
Step 3
Q:: 为什么 ConcurrentHashMap 比 HashTable 性能更好?
A:: ConcurrentHashMap 比 HashTable 性能更好的原因在于锁的粒度更小。HashTable 使用 synchronized 锁整个表,这意味着任何读写操作都会阻塞所有其他操作。而 ConcurrentHashMap 通过分段锁(在 1.7 中)和更细粒度的锁(在 1.8 中)来减少锁的范围,从而提高并发性能。此外,1.8
版本引入了红黑树结构,在大量数据的情况下性能更佳。
Step 4
Q:: ConcurrentHashMap 中的 computeIfAbsent 方法是如何工作的?
A:: computeIfAbsent 方法是 ConcurrentHashMap 中用于在键不存在时计算并插入值的方法。它的工作原理是:首先检查指定的键是否已经存在于 Map 中,如果存在则直接返回对应的值。如果不存在,则计算指定的值(通过提供的函数),并插入到 Map 中,然后返回计算出的值。此方法保证了并发环境下的原子性,避免了并发问题。
Step 5
Q:: 什么是 Java 中的 CAS 操作?
A:: CAS(Compare-And-
Swap)是一种原子操作,用于实现无锁并发。它包含三个操作数:内存位置、预期值和新值。CAS 操作检查内存位置的当前值是否等于预期值,如果是,则将该位置的值更新为新值;如果不是,则不做任何操作。通过循环重试机制,CAS 可以在多线程环境下安全地执行更新操作,而不需要使用锁。