ConcurrentHashMap 和 Hashtable 的区别 主要体现在实现线程安全的方式上不同。
1.底层数据结构:
JDK1.7的ConcurrentHashMap 底层采用的是分段的数组和链表实现,JDK1.8之后数据 +链表/红黑二叉数。
Hashtable 底层采用的是数据+链表,数组是HashMap的主体,链表则是为了解决哈希冲突而存在的;
2.实现线程的安全方式:
在JDK1.7的时候,ConcurrentHashMap (分段锁),对整个桶数组进行分割分段(Segment),每一把锁只锁容器其中一部分数据,多线程访问容器里不同数据段的数据,就不会存在锁竞争,提高并发访问率。
JDK1.8,已经摒弃了Segment概念,而是直接使用Node数组+链表/红黑树的数据结构来实现,并发控制使用synchronized 和 CAS来操作(JDK1.6对synchronized做了很多优化)。整体看起来就像优化过且线程安全的HashMap,虽然在JDK1.8中还能看到Segment的数据结构,但是已经简化了属性,只是为了兼顾旧版本。
HashTable(同一把锁):使用synchronized来保证线程安全,效率非常低下,当多个线程同时访问同步方法时,可能会进入阻塞或轮训状态,如使用put添加元素,另一个线程就不嗯呢该使用put添加元素,也不能get,竞争就会越来越激烈。
两者对比图
图片来源:http://www.cnblogs.com/chengxia