Java集合框架_ ConcurrentHashMap和Hashtable的区别

ConcurrentHashMap和Hashtable的区别主要体现在实现线程安全的方式上的不同。

1、底层数据结构:jdk1.7的ConcurrentHashMap底层采用分段的数组+链表实现,jdk1.8采用的数据结构是跟HashMap1.8的结构一样,数组+链表/红黑二叉树。Hashtable和jdk1.8之前的HashMap的底层数据结构都是采用数组+链表的形式,数组是Hash Map的主体,链表则是主要为了解决哈希冲突而存在的。

2、实现线程安全的方式(重要):

  在jdk1.7中,ConcurrentHashMap对整个桶数组进行了分割分段,每一把锁只锁容器的其中一部分数据,多线程访问容器里不同段的数据,就不会存在竞争,提高了并发访问率。到了jdk1.8的时候已经摒弃了Segment的概念,而是直接用Node数组+链表+红黑树的数据结构来实现,并发控制使用synchronized和CAS操作,整个看起来就像是优化过且线程安全的Hash Map操作

  Hashtable:使用 synchronized 来保证线程安全, 效率非常低下。当一个线程访问同步方法时,其他线程也访问同步方法,可能会进入阻塞或轮询状态,如使用 put 添加元素,另一个线程不能使用 put 添加元素,也不能使用 get,竞争会越来越激烈效率越低。

JDK1.7的ConcurrentHashMap:

JDK1.8的ConcurrentHashMap(TreeBin: 红黑二叉树节点 Node: 链表节点):

 

posted @ 2019-08-05 22:40  chyblogs  阅读(399)  评论(0)    收藏  举报