[JAVAEE] 面试题(五) - HashMap, Hashtable, ConcurrentHashMap

server/2024/11/14 1:40:59/

目录

  • 一. Hashtable
    • 1.1 Hashtable效率低下的原因:
  • 二. ConcurrentHashMap
    • 2.1 ConcurrentHashMap更高效的原因:
  • 三. HashMap, Hashtable, ConcurrentHashMap 之间的区别

HashMap是线程不安全的.
在多线程环境下, 使用:

  • Hashtable
  • ConcurrentHashMap

来确保线程安全.

一. Hashtable

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如上所示, Hashtable类中所有涉及线程安全的方法和大部分不涉及线程安全的方法都被加上了synchronized关键字, 来确保线程安全.

1.1 Hashtable效率低下的原因:

  • Hashtable类中的所有桶, 共同持有一个锁, 竞争激烈.
  • size的值会被频繁的修改, 这时修饰size的synchronized锁会升级成重量级锁.
  • 只能一个线程进行扩容操作, 运行效率低.

在这里插入图片描述
以上种种原因, 导致Hashtable是一种效率低下的哈希表, 因此, 现在使用更多的是ConcurrentHashMap.

二. ConcurrentHashMap

相比于Hashtable, ConcurrentHashMap的效率更高, 各项优化也做的更好.

2.1 ConcurrentHashMap更高效的原因:

  • 对读操作没有加锁, 并且使用volatile关键字来确保从内存中读取结果. 使用"锁桶"的方式对写操作进行加锁, 即对每个桶都分配一把锁, 大大降低了锁竞争的概率, 提高了程序运行效率.
  • 充分利用CAS特性, 比如size属性通过CAS操作来更新, 避免出现重量级锁的情况.
  • 优化了扩容方式, 化整为零. 即发现需要扩容的数组时, 创建一个新的数组, 然后多个线程同时进行扩容操作, 这样每个线程只需要负责一小部分的数据.

在这里插入图片描述

三. HashMap, Hashtable, ConcurrentHashMap 之间的区别

  • HashMap线程不安全, Key允许为null
  • Hashtable线程安全, Key不允许为null, 一个Hashtable对象只持有一把锁(即多个桶持有同一把锁).
  • ConcurrentHashMap线程安全,Key不允许为null, 一个Concurrent对象持有多把锁(即每个桶持有一把锁, 并且锁对象是每个链表头结点), 充分利用CAS并发机制(减少重量级锁的出现), 优化了扩容机制(多个线程进行赋值扩容).

http://www.ppmy.cn/server/141236.html

相关文章

科技改变生活:最新智能开关、调光器及插座产品亮相

根据QYResearch调研团队的最新力作《欧洲开关、调光器和插座市场报告2023-2029》显示,预计到2029年,欧洲开关、调光器和插座市场的规模将攀升至57.8亿美元,并且在接下来的几年里,将以4.2%的复合年增长率(CAGR&#xff…

pytest简单使用

一:Mark 1.注册标记 在项目根目录下创建固定名为 pytest.ini 的配置文件,文件格式需要加上 [pytest] ,然后通过 markers 注册自定义标记 2.贴上标记 通过pytest加上装饰器,然后pytest.mark.XX配置自定义的标记,一个…

JS之正则表达式

一、什么是正则表达式 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </…

llamaIndex和langchain对比及优劣对比

一. LangChain vs LlamaIndex: 基本描述 LlamaIndex在搜索和检索任务方面表现出色。它是一个强大的数据索引和查询工具&#xff0c;非常适合需要高级搜索的项目。LlamaIndex能够处理大型数据集&#xff0c;从而实现快速准确的信息检索。 LangChain是一个模块化和灵活的工具集框…

window下安装rust 及 vscode配置

安装 安装mingw64 &#xff08;c语言环境 选择posix-ucrt&#xff09; ucrt:通用c运行时库配置mingw64/bin的路径到环境变量中在cmd窗口中输入命令 "gcc -v" 4. 下载Rust安装程序 安装 Rust - Rust 程序设计语言 5. 配置rustup和cargo目录 &#xff08;cargo是包管…

我国成功发射航天宏图PIESAT-2 01~04星

11月9日11时39分&#xff0c;我国在酒泉卫星发射中心使用长征二号丙运载火箭&#xff0c;成功将航天宏图PIESAT-2 01&#xff5e;04星发射升空&#xff0c;卫星顺利进入预定轨道&#xff0c;发射任务获得圆满成功[1]。 航天宏图信息技术股份有限公司&#xff08;以下简称“航天…

nVisual前端目录结构

一、前端项目部署包目录结构 1. cloud-files 存放文件的文件夹&#xff0c;cloud用户使用的&#xff0c;非saas项目用不到2. config 用于存放全局的配置文件&#xff1b;access.js 登录页面配置&#xff0c;配置页面样式图片和交互 api.js 用于设置全局的请求域名&#xff0c…

ONLYOFFICE 8.2测评:功能增强与体验优化,打造高效办公新体验

引言 随着数字化办公需求的不断增长&#xff0c;在线办公软件市场竞争愈加激烈。在众多办公软件中&#xff0c;ONLYOFFICE 无疑是一个颇具特色的选择。它不仅支持文档、表格和演示文稿的在线编辑&#xff0c;还通过开放的接口与强大的协作功能&#xff0c;吸引了众多企业和个人…