面试题答案
一键面试性能
- 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:锁的粒度是整个哈希表,对所有的读写操作都使用同一把锁,只要有一个线程访问哈希表,其他线程都必须等待,锁粒度大,并发性能低。