面试题答案
一键面试1. Hashtable
- 性能特点:
- 读操作:由于
Hashtable
的方法基本都被synchronized
修饰,读操作也会获取锁,在高并发读场景下,大量线程竞争锁,导致性能较低。 - 写操作:写操作同样需要获取锁,锁粒度是整个
Hashtable
,当有多个线程同时进行写操作时,竞争激烈,会严重影响性能。
- 读操作:由于
- 适用场景:几乎不适用高并发场景,仅适用于单线程或并发度极低的场景。
2. ConcurrentHashMap
- 性能特点:
- 读操作:
- 读操作通常不需要加锁(除了扩容时部分操作),采用了无锁化的设计,例如使用
volatile
修饰的数组以及CAS
操作等,因此读性能非常高,在高并发读场景下表现优异。 - 即使在并发写操作时,读操作也基本不受影响。
- 读操作通常不需要加锁(除了扩容时部分操作),采用了无锁化的设计,例如使用
- 写操作:
- 锁粒度细化,在
JDK 1.7
及之前采用分段锁(Segment
)的机制,每个Segment
独立加锁,不同Segment
上的写操作可以并发执行,相较于Hashtable
的全局锁大大提高了并发度。 - 在
JDK 1.8
及之后,摒弃了分段锁,采用数组 + 链表 / 红黑树的结构,并使用CAS
和synchronized
结合的方式来保证数据的一致性和并发控制。synchronized
仅作用于链表头节点或红黑树根节点,进一步提升了写操作的并发性能。
- 锁粒度细化,在
- 读操作:
- 适用场景:非常适合高并发读写场景,例如在高并发的服务器端应用中,缓存的实现等场景都可以使用
ConcurrentHashMap
。
3. 对比总结
- 性能:在高并发读写场景下,
ConcurrentHashMap
性能远远优于Hashtable
。ConcurrentHashMap
读操作无锁化设计使其读性能高,写操作通过锁粒度细化等方式提升并发度,减少线程竞争。 - 适用场景:
Hashtable
适用于低并发场景,ConcurrentHashMap
适用于高并发读写场景,能充分利用多核CPU的优势,提供高效的并发访问。