ConcurrentHashMap
概念
- ConcurrentHashMap 和 Hashtable 的区别主要体现在实现线程安全的方式上不同
- JDK1.7的 ConcurrentHashMap 底层采用 分段的数组+链表 实现
- JDK1.8 采用的数据结构是数组+链表+红黑二叉树
- 在JDK1.7的时候,ConcurrentHashMap(分段锁) 对整个桶数组进行了 分割分段(Segment),每一把锁只锁容器其中一部分数据,多线程访问容器里不同数据段的数据,就不会存在锁 竞争,提高并发访问率
- ConcurrentHashMap到了 JDK1.8 的时候已经摒弃了Segment的概念,而是直接用 Node 数组+链表+红黑 树的数据结构来实现,并发控制使用 synchronized 和 CAS 来操作
Hashtable
概念
- Hashtable是采用 数组+链表的形式
- Hashtable是线程安全的
- Hashtable使用 synchronized 来保证线程安全, 效率较低
- Hashtable当一个线程访问同步方法时,其他线程也访问同步方法,可能会进入阻塞或轮询状态
- Hashtable如使用 put 添加元素,另一个线程不能使用 put 添加元素,也不能使用 get,竞争会越来越激烈效率越低