当前位置: 首页 > news >正文

HashTable, HashMap, ConcurrentHashMap 之间的区别

 一、HashTable

只是将关键方法加上了锁(synchronized关键字)。

缺点:1.如果多线程访问同一个HashTable就回直接造成锁冲突。

            2.HashTable的size属性也是通过 synchronized来控制同步的,效率比较低。

            3.在扩容时会涉及大量的拷贝,效率十分低。

            4.key值不允许为null。

总结:一个HashTable只有一个锁,两个线程访问HashTable中的任意数据都会出现锁竞争。

二、HashMap

是线程不安全的,在多线程环境下,如果多个线程同时对 HashMap 进行读写操作,可能会导致数据不一致或出现并发修改异常等问题。

key值允许为null。

三、ConcurrentHashMap

相对于HashTable进行了优化,使用了更细的锁机制和CAS机制。以JDK1.8为例:

1.读操作没有加锁,但是使用了volatile来保证只从内存中读取结果。

2.对写操作进行了加锁,加锁方式依旧是synchronized,但是不是对整个对象进行加锁,而是对“桶”进行加锁(用每个链表的头结点作为锁对象),大大降低了锁冲突的概率。

3.size属性使用CAS来更新,避免了重量级锁的情况。

4.扩容策略改变:

<1>:发现需要扩容的线程,只创建一个数组,同时只搬几个数据过去。

<2>:扩容时期,新老数组同时存在。

<3>:后续每个来操作ConcurrentHashMap的线程,都会参与搬家的过程,每次只搬一小部分元素。

<4>:当搬好后,将老数组删除。

<5>:在搬家过程中,若执行插入操作,则只向新数组中插入。

<6>:搬家时,执行查找操作时,需要同时查找新老数组。

5.key值不允许为null。

总结:ConcurrentHashMap每个哈希桶上都有一把锁,只有两个线程恰好访问同一个哈希桶时才会出现锁冲突。

http://www.lryc.cn/news/526641.html

相关文章:

  • vue2和vue3组件之间的通信方式差异
  • 报错:MC1000未知的生成错误Invalid number of sections declared in PE header
  • FPGA实现任意角度视频旋转(二)视频90度/270度无裁剪旋转
  • Linux(Centos 7.6)命令详解:wc
  • centos7执行yum操作时报错Could not retrieve mirrorlist http://mirrorlist.centos.org解决
  • C语言程序设计:算法程序的灵魂
  • openlayer getLayerById 根据id获取layer图层
  • 在 vscode + cmake + GNU 工具链的基础上配置 JLINK
  • react antd点击table单元格文字下载指定的excel路径
  • 01-AD工具使用
  • centos7 配置国内镜像源安装 docker
  • Java设计模式 十八 状态模式 (State Pattern)
  • PyTorch张量操作reshape view permute transpose
  • RabbitMQ5-死信队列
  • macOS使用LLVM官方发布的tar.xz来安装Clang编译器
  • 【算法学习】归并排序算法思想的应用—求逆序对数量
  • 一组开源、免费、Metro风格的 WPF UI 控件库
  • Spring Security 应用详解
  • 业务对象和对象的区别
  • 81,【5】BUUCTF WEB [b01lers2020]Life on Mars
  • 华硕笔记本装win10哪个版本好用分析_华硕笔记本装win10专业版图文教程
  • Linux进程 -fork(初识),进程状态和进程优先级
  • 数据从前端传到后端入库过程分析
  • macOS如何进入 Application Support 目录(cd: string not in pwd: Application)
  • 第38周:猫狗识别 (Tensorflow实战第八周)
  • 【2024年华为OD机试】 (A卷,200分)- 计算网络信号、信号强度(JavaScriptJava PythonC/C++)
  • 【go语言】数组和切片
  • 2025美赛MCM数学建模A题:《石头台阶的“记忆”:如何用数学揭开历史的足迹》(全网最全思路+模型)
  • 使用 Docker Compose 一键启动 Redis、MySQL 和 RabbitMQ
  • 新增自定义数据功能|UWA Gears V1.0.7