ConcurrentHashMap和Hashtable的区别
- 从底层数据结构来看:
ConcurrentHashMap在JDK1.8之前,底层使用分段数组(segment数组存放Entry数组)实现,1.8之后使用的是数组+链表/红黑树结构;
而Hashtable一直使用数组+链表结构; - 从线程安全的实现方式来看:
二者都是线程安全的,但是ConcurrentHashMap在JDK1.8之前使用分段锁的方法,一个ConcurrentHashMap有多个Segment,每个segment内存放多个Entry,Segment本身又实现了ReentrantLock,是可重入锁,所以要访问Entry时,要先获取它所在段的segment(分段锁),以每段的线程安全实现整个的线程安全;在1.8之后,使用了CAS和synchronized方法,给每个Node或者TreeBin都上了一把锁,以每个链表的头结点或红黑树的根节点的线程安全达到整个的线程安全,这时只有哈希冲突时才会发生锁竞争;
而Hashtable实现线程安全只使用了一把锁sychronized,很容易发生竞争锁和阻塞轮询,效率低下;
所以Hashtable基本被淘汰,新代码想要多线程使用Map建议选用ConcurrentHashMap;