前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >HashMap、HashTable、ConcurrentHashMap 的区别

HashMap、HashTable、ConcurrentHashMap 的区别

作者头像
Li_XiaoJin
发布2022-06-10 19:41:50
3420
发布2022-06-10 19:41:50
举报
文章被收录于专栏:Lixj's BlogLixj's Blog

HashMap、HashTable、ConcurrentHashMap

  1. HashMap在多线程环境下,使用HashMap进行put操作会引起死循环,导致CPU 利用率接近100%。 HashMap在并发进行put操作会引起死循环,因为多线程会导致HashMap的Entry链表形成环形数据结构,一旦形成,Entry的next节点永远不为空,就会产生死循环获取Entry.
  2. HashTable使用synchronized来保证线程安全,但在激烈竞争的情况下效率非常低下。因为一个线程访问HashTable的同步方法,其他线程也访问HashTable的同步方法时,会进入阻塞或轮循状态。如线程1使用put进行元素添加,线程2不但不能使用put方法进行添加元素,也不能使用get方法获取元素,所以竞争越激烈效率越低。
  3. HashTable在积累并发的环境下表现出效率低下的原因是所有访问HashTable的线程都必须竞争同一把锁。ConcurrentHashMap使用锁分段技术,首先将数据分为一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一段数据的时候,其他段的数据也能被其他线程访问。

ConcurrentHashMap由Segment数组结构和HashEntry数组结构组成。Segment是一种可重入锁(ReentrantLock),扮演锁的角色;HashEntry用于存储键值对数据。 为了能通过位于散列算法来定位segment数组的索引,必须保证Segment数组的长度是2的N次方,所以必须计算出一个大于或等于concurrencyLevel的最小的2的N次方值来作为segment数组的长度。

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://cloud.tencent.com/developer/article/2020431

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-04-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档