面试题答案
一键面试策略
可以使用 ConcurrentHashMap
来替代 Hashtable
。
原理
- 锁的粒度:
Hashtable
对整个哈希表加锁,在高并发场景下,当一个线程访问Hashtable
的任何方法时,其他线程都必须等待锁的释放,这大大降低了并发性能。ConcurrentHashMap
采用分段锁(JDK1.7 及之前)或 CAS 操作 + synchronized 锁部分节点(JDK1.8 之后)的机制。在 JDK1.7 中,它将哈希表分成多个段(Segment),每个段都有自己独立的锁。不同线程可以同时访问不同段的数据,只有在访问同一分段的数据时才需要竞争锁,从而提高了并发性能。在 JDK1.8 中,放弃了分段锁机制,采用 CAS 操作来更新哈希表的一些操作,并对链表或红黑树的头节点使用 synchronized 锁,进一步减少了锁的粒度,提升了并发性能。
- 读操作优化:
Hashtable
的读操作也需要获取锁,这增加了线程等待时间。ConcurrentHashMap
在 JDK1.7 中读操作大部分时候不需要加锁,因为数据结构中的共享变量使用volatile
修饰,保证了可见性,所以读操作可以直接读取数据而不需要获取锁。在 JDK1.8 中,读操作基于 CAS 等无锁操作,进一步提升了读性能,使得读操作可以与写操作更好地并发执行。