面试题答案
一键面试锁机制
- HashTable:使用了一个全局锁,当多个线程访问HashTable时,只要有一个线程获取到锁,其他线程就必须等待。这种方式虽然保证了线程安全,但在高并发环境下,性能较低,因为同一时间只能有一个线程进行读写操作。
- ConcurrentHashMap:从JDK 1.7开始采用分段锁(Segment)机制,它将数据分成多个段(默认16个),每个段都有自己独立的锁。不同段的数据可以被不同线程同时访问,从而提高了并发性能。在JDK 1.8中,摒弃了分段锁机制,采用CAS(Compare And Swap)和synchronized相结合的方式。对数组的头节点使用synchronized锁,在更新节点时使用CAS操作,进一步提升了并发性能。
数据结构
- HashTable:基于哈希表数据结构,内部是一个数组,数组元素是Entry对象,Entry对象存储键值对数据。
- ConcurrentHashMap:在JDK 1.7中,ConcurrentHashMap由Segment数组和HashEntry数组组成,Segment继承自ReentrantLock,每个Segment管理着一个HashEntry数组。在JDK 1.8中,数据结构和HashMap类似,采用数组 + 链表 + 红黑树的结构。当链表长度超过阈值(默认8)时,链表会转化为红黑树,以提高查询效率。
性能差异总结
在多线程环境下,ConcurrentHashMap的性能明显优于HashTable。HashTable的全局锁机制限制了并发访问,而ConcurrentHashMap的分段锁(JDK 1.7)或CAS与synchronized结合(JDK 1.8)的方式,使得在高并发场景下,能够有更多的线程同时进行读写操作,从而提高了整体的性能和吞吐量。