MST

星途 面试题库

面试题:Java中ConcurrentHashMap与Hashtable在并发场景下的区别

请详细阐述Java中ConcurrentHashMap与Hashtable在并发环境下使用时,在性能、线程安全机制、锁的粒度等方面存在哪些区别。
44.8万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

性能

  • ConcurrentHashMap:在高并发环境下性能较好。它采用了分段锁机制(Java 8之前),允许多个线程同时访问不同的段,减少了锁竞争。Java 8 之后引入了红黑树结构进一步优化查询性能,并且使用CAS操作和synchronized关键字来控制并发,读写操作可以并行执行,大大提高了并发性能。
  • Hashtable:性能相对较差。它对整个哈希表加锁,在高并发场景下,所有线程都需要竞争同一把锁,导致线程竞争激烈,严重影响性能。

线程安全机制

  • ConcurrentHashMap:线程安全。通过分段锁(Java 8之前)或者CAS操作与synchronized关键字(Java 8及之后)保证线程安全。在读多写少的场景下,读操作基本无锁,写操作只锁定当前需要修改的部分,不影响其他部分的读写操作。
  • Hashtable:线程安全。通过对所有的读写操作都使用synchronized关键字进行同步,保证同一时间只有一个线程能访问哈希表,这种方式虽然保证了线程安全,但过于粗暴,并发性能较低。

锁的粒度

  • ConcurrentHashMap:Java 8之前,锁的粒度是段(Segment),一个ConcurrentHashMap由多个Segment组成,每个Segment就像一个小的Hashtable,不同Segment可以被不同线程同时访问。Java 8之后,锁的粒度进一步细化,采用CAS和synchronized结合,synchronized只作用于链表头节点或者红黑树的根节点,锁的粒度更小,并发性能更好。
  • Hashtable:锁的粒度是整个哈希表,对所有的读写操作都使用同一把锁,只要有一个线程访问哈希表,其他线程都必须等待,锁粒度大,并发性能低。