MST

星途 面试题库

面试题:Java多线程下替代Hashtable方案的性能对比

在多线程环境中,常见的替代Hashtable的方案如ConcurrentHashMap等,请对比它们在高并发读写场景下的性能特点及适用场景。
42.3万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

1. Hashtable

  • 性能特点
    • 读操作:由于Hashtable的方法基本都被synchronized修饰,读操作也会获取锁,在高并发读场景下,大量线程竞争锁,导致性能较低。
    • 写操作:写操作同样需要获取锁,锁粒度是整个Hashtable,当有多个线程同时进行写操作时,竞争激烈,会严重影响性能。
  • 适用场景:几乎不适用高并发场景,仅适用于单线程或并发度极低的场景。

2. ConcurrentHashMap

  • 性能特点
    • 读操作
      • 读操作通常不需要加锁(除了扩容时部分操作),采用了无锁化的设计,例如使用volatile修饰的数组以及CAS操作等,因此读性能非常高,在高并发读场景下表现优异。
      • 即使在并发写操作时,读操作也基本不受影响。
    • 写操作
      • 锁粒度细化,在JDK 1.7及之前采用分段锁(Segment)的机制,每个Segment独立加锁,不同Segment上的写操作可以并发执行,相较于Hashtable的全局锁大大提高了并发度。
      • JDK 1.8及之后,摒弃了分段锁,采用数组 + 链表 / 红黑树的结构,并使用CASsynchronized结合的方式来保证数据的一致性和并发控制。synchronized仅作用于链表头节点或红黑树根节点,进一步提升了写操作的并发性能。
  • 适用场景:非常适合高并发读写场景,例如在高并发的服务器端应用中,缓存的实现等场景都可以使用ConcurrentHashMap

3. 对比总结

  • 性能:在高并发读写场景下,ConcurrentHashMap性能远远优于HashtableConcurrentHashMap读操作无锁化设计使其读性能高,写操作通过锁粒度细化等方式提升并发度,减少线程竞争。
  • 适用场景Hashtable适用于低并发场景,ConcurrentHashMap适用于高并发读写场景,能充分利用多核CPU的优势,提供高效的并发访问。