码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 谈谈HashTable, HashMap, ConcurrentHashMap 之间的区别(一道经典的面试题)


    目录

    一、HashMap

    二、HashTable

     三、ConcurrentHashMap

    四、总结


    一、HashMap

     

    HashMap没有对线程安全做任何有效的措施,是线程不安全的

     

    二、HashTable

    我们可以看到在HashTable的源码当中,只是简单的把关键方法加上了 synchronized 关键字,这样就相当于是直接针对HashTable对象本身进行了加锁

     

     但这样做虽然保证了线程安全,但也存在着一些问题:

    • 很多时候不同的线程所操作的是不同的哈希桶(链表),并不会产生线程安全问题,但HashTable仍然一棒子打死——对整体加了锁
    • size 属性也是通过 synchronized 来控制同步, 也是比较慢的.
    • 一旦触发扩容, 就由该线程完成整个扩容过程. 这个过程会涉及到大量的元素拷贝, 效率会非常低.
       

     

     三、ConcurrentHashMap

    于是ConcurrentHashMap相比于 Hashtable 做出了一系列的改进和优化. 以 Java1.8 为例


     1、ConcurrentHashMap把锁的粒度细化了,对每一个哈希桶都加了锁——这样只有当不同线程对同一个哈希桶中的元素进行操作时才会产生冲突,因为一个哈希表有很多哈希桶,这就大大降低了冲突的概率

     2、充分利用 CAS 特性. 比如 size 属性通过 CAS 来更新. 避免出现重量级锁的情况

    3、优化了扩容方式: 化整为零

    • 发现需要扩容的线程, 只需要创建一个新的数组, 同时只搬几个元素过去.
    • 扩容期间, 新老数组同时存在.
    • 后续每个来操作 ConcurrentHashMap 的线程, 都会参与搬家的过程. 每个操作负责搬运一小部分元素.
    • 搬完最后一个元素再把老数组删掉.
    • 这个期间, 插入只往新数组加.
    • 这个期间, 查找需要同时查新数组和老数组

     

     

    四、总结

    1. HashMap线程不安全、HashTable、ConcurrentHashMap线程安全
    2. HashTable是整体加了一把大锁,发生锁竞争的概率较大。ConcurrentHashMap是给数组的每个下标所对应的哈希桶都加了一把锁,把锁细分了,大大降低了发生锁竞争的概率。
    3. ConcurrentHashMap充分利用了CAS机制,优化了扩容方式
    4. HashMap的key允许为null,其他两个不允许

     

  • 相关阅读:
    Hashtable和HashMap、ConcurrentHashMap 之间的区别
    PDF应该怎么转换成Excel文档呢?
    快递鸟顺丰、申通物流查询类通用接口文档
    【Linux】进程的地址空间
    [附源码]Python计算机毕业设计SSM景区在线购票系统(程序+LW)
    springboot系列(十六):如何实现发送邮件提醒,附完整源码(完结篇)
    H5游戏开发与App游戏开发:有什么不同?
    4、vue路由
    git报错The project you were looking for could not be found 解决方式
    什么是卷积神经网络?解决了什么问题?
  • 原文地址:https://blog.csdn.net/weixin_61061381/article/details/126118726
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号