HashTable和ConcurrentHashMap的区别

首先HashTable和ConcurrentHashMap都是线程安全的哈希表,我们知道在JDK1.8之后哈希表的底层是数组 + 链表,在数组长度大于等于64且链表长度大于等于8的时候链表会变成红黑树,增加我们的查询效率,但是HashMap是线程不安全的集合类,当我们有多个线程进行修改同一个变量的时候,会造成实际结果和预期结果不服的现象,如果我们要保证我们的线程安全,我们可以使用线程安全的哈希表进行操作,这时候我们Java中提供了两种线程安全的哈希表,HashTable和ConcurrentHashMap。

HashTable:HashTable是线程安全的哈希表,但是我们观察底层源码会发现,HashTable保证线程安全无非就是给每个方法都用synchronized关键字进行加锁,这样我们的整个哈希表只有一把锁,当我们有十个线程竞争锁的时候,只要有一个线程的到锁,其他九个线程就需要阻塞等待,这会导致整个效率比较低效。所以我们使用ConcurrentHashMap这样的线程安全的哈希表更好。

 

 

 ConcurrentHashMap:

优点1:在JDK1.7的时候,我们的ConcurrentHashMap使用叫分段锁的概念来对哈希表保证线程线程安全,相较于HashTable的一个哈希表只有一个锁来说,ConcurrentHashMap中有多个锁,我们把整个哈希表分为几段,每一段都有一个锁,就降低了我们锁冲突的一个概率。在JDK1.8之后每个哈希桶都配有一把锁,而且当我们计算的hashCode不相同的时候,不会触发锁冲突,把锁的粒度变得更小了。

优点2:ConcurrentHashMap对读操作不加锁,只对写操作进行加锁。

优点3:ConcurrentHashMap更好的利用了我们的CAS机制,比如我们获取ConcurrentHashMap中的size属性,就是通过我们的CAS,来避免出现重量级锁的情况

优点4:优化了扩容问题,发现需要扩容的线程,ConcurrentHashMap会创建一个新的数组,同时只是搬移几个元素过去,不是copy一个数组。扩容期间,我们的新老数组共同存在,每一次对ConcurrentHashMap进行操作,就从老数组搬移一些元素到新数组,等到搬完之后,在释放掉老数组,这样就提高了我们的效率。

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HashtableConcurrentHashMap是两种不同的数据结构,它们在安全性、同步性和速度方面有所区别。 首先,Hashtable是一个过时的类,而ConcurrentHashMap是一个线程安全的类。Hashtable的大部分方法都被synchronized修饰,因此是线程安全的,而HashMap则是非线程安全的。这意味着在多线程环境下,使用Hashtable可以避免出现线程冲突的问题,而使用HashMap可能会出现异常。 其次,HashtableConcurrentHashMap对于键值的要求也不同。Hashtable的键值都不能为null,而HashMap的键值可以为空。这意味着在使用Hashtable时,需要确保键值不为空,否则会出现异常。而在HashMap中,可以允许键值为空的情况。 此外,ConcurrentHashMap相对于Hashtable和HashMap在效率上更高一些。这是因为Hashtable的大部分方法都被synchronized修饰,获取锁会耗费时间,导致效率相对较低。而ConcurrentHashMap采用了稍微细粒度的锁机制,将哈希表分为多个桶,在常用的操作中只锁定当前需要用到的桶,从而提高了并发性能。 因此,根据实际场景的需求,我们可以根据安全性、同步性和速度的要求来选择使用Hashtable还是ConcurrentHashMap作为数据结构。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [HashMap、HashtableConcurrentHashMap区别](https://blog.csdn.net/qq_33479841/article/details/119755516)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [JavaConcurrentHashMap学习](https://blog.csdn.net/imzoer/article/details/8621074)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值