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

JavaWeb——多线程使用哈希表

目录

一、HashMap

1、定义 

二、HashTable

1、定义:

2、区别:

三、ConcurrentHashMap

1、定义:

2、优化

(1)、加锁粒度不同——触发锁冲突的频率不同

(2)、充分利用CAS机制——无锁编程

(3)、优化扩容策略


一、HashMap

1、定义 

HashMap是通过哈希表实现的,相比于1.7由数组+链表组成的版本,1.8的版本是由是数组+链表+红黑树组成的。HashMap的每一个元素都是一个key-value键值对,其内部通过单链表解决冲突问题,容量不足时会自动增长。

HashMap中key和value都允许为null,键值对以key为头结点放在链表中。

注:HashMap是非线程安全的

二、HashTable

1、定义:

HashTable是线程安全的,其只是简单的把关键方法加上synchronized关键字,相当于直接针对 HashTable对象本身加锁。

  • 多线程访问同一个HashTable时会直接造成锁冲突。
  • size属性是通过synchronized来控制同步,每次都会花费内存,时间较长效率较低。
  • 触发扩容时,由该线程完成整个扩容过程。这个过程会涉及到大量的元素拷贝,效率非常低。

一个HashTable只有一把锁,两个线程访问HashTable中的任意数据都会出现锁竞争。有两个线程要操作这两个元素时,由于是同一把锁所以会产生锁竞争。但是这两操作在不同的哈希桶上,不牵扯修改同一个变量,因此就不会发生线程安全,所以上面的锁竞争是没有必要的。但如果两个修改落到同一个哈希桶上,有线程安全风险。

2、区别:

  • HashTable与HashMap在原理上基本上相同,它们之间的区别在于HashTable的大部分方法是被synchronized所修饰的,并且键值都不能为null
  • 相比于HashMap的线程不安全,HashTable是线程安全的。由于HashTable大部分方法被synchronized修饰,因此是其是线程安全的。HashMap则是非线程安全的,大量的线程存取可能会出现异常。
  • HashMap效率相比HashTable较高,因为synchronized修饰方法,获取锁会耗费时间,导致效率相对较低。

三、ConcurrentHashMap

1、定义:

ConcurrentHashMap底层是基于数组+链表实现的,JDK1.7版本中的数据结构采用分段式设计,通过segment数组+HashEntry数组+链表来实现,哈希冲突采用拉链法处理。而在JDK1.8的版本中,HashMap的设计思想采用数组+链表+红黑树的数据结构,并且由原来的分段式锁换成了CAS+Synchronized锁

ConcurrentHashMap相比于 HashTable 做出了一系列的改进和优化。 Java1.8 为例读操作没有加锁(但是使用了 volatile 保证从内存读取结果)只对写操作进行加锁。
加锁的方式仍然是用synchronized,但不是锁整个对象而是“锁桶”(用每个链表的头结点作为锁对象),大大降低了锁冲突的概率。充分利用 CAS 特性比如size属性通过 CAS 来更新避免出现重量级锁的情况。
优化扩容方式:化整为零。发现需要扩容的线程时,只需要创建一个新的数组同时只搬几个元素过去。扩容期间,新老数组同时存在。后续每个操作ConcurrentHashMap的线程都会参与搬家的过程,每个操作负责搬运一小部分元素。搬完最后一个元素再把老数组删掉,这个期间插入只往新数组加,而查找需要同时查新数组和老数组。

2、优化

(1)、加锁粒度不同——触发锁冲突的频率不同

HashTable是针对整个哈希表加锁,任何增删查改的操作都会触发加锁,也就都可能有锁竞争。

如果是两个线程同时插入元素:线程1在下标为1的链表上插入元素,线程2在下标为2的链表上插入元素。

两个线程修改不同变量时不存在线程安全问题,但是由于synchronized是加到this上的,仍然会针对同一个对象产生锁竞争,产生阻塞等待。

相比于HashTable,ConcurrentHashMap是将每个链表(头节点)作为一把锁,每次进行操作都是针对对应链表的锁进行加锁。操作不同链表就是针对不同的锁加锁,不会有锁冲突。

(2)、充分利用CAS机制——无锁编程

有的操作,比如获取/跟新元素个数,就可以直接使用CAS完成,不必加锁。

CAS也能保证线程安全,往往比锁更高效,但是不经常使用,适用范围不像锁那么广泛。

(3)、优化扩容策略

对于HashTable如果元素太多会涉及到扩容——负载因子。

扩容需要重新申请内存空间,搬运空间(把元素从旧的哈希表上删掉,插入到新的哈希表上)。

如果本身元素非常多,搬运一次成本很高会导致这一次的操作非常卡顿。ConcurrentHashMap将其化整为零,并不会试图一次性的把所有元素都搬运过去,而是每次操作过程中只搬运一小部分,此时相当于同时存在两份哈希表。当插入元素时直接往新表插入元素,删除元素时元素在哪个表上删除哪个表,查找元素时新表旧表都查询。

相关文章:

JavaWeb——多线程使用哈希表

目录 一、HashMap 1、定义 二、HashTable 1、定义: 2、区别: 三、ConcurrentHashMap 1、定义: 2、优化 (1)、加锁粒度不同——触发锁冲突的频率不同 (2)、充分利用CAS机制——无锁编程…...

anaconda permission denied

可能是路径不对 我的是只写了dir,没写文件名,而我要的是某个文件的路径,所以就报这个错。 具体,我需要某个权重的路径,比如pytorch_resnet50.pth,但我只写了这个权重所在的dir,比如F:/software/…...

蓝桥杯带刷,带刷!!!

A:::::::::::::::::::::::::::::::::::m计划(双指针,滑动窗口,倍增) 题目描述 小明是个鹅卵石收藏者,从小到大他一共收藏了 nn 块鹅卵石,编号分别为 1∼n,价值分别为 a1​,a2​&…...

第03讲:MinIO分布式文件服务器

一、什么是MinIO Minio 是个基于 Golang 编写的开源对象存储套件,虽然轻量,却拥有着不错的性能。 官网地址:MinIO | High Performance, Kubernetes Native Object Storageopen in new window官网文档地址:MinIO | The MinIO Qui…...

WireShark

wireshark 常用命令&#xff1a; frame.len 帧数据总长度&#xff1a;包含MAC头IP头UDP头UDP数据 eg: 1、 重传命令的长度是62, Frame.len 62 2、 长度大于200的包&#xff0c;frame.len > 200 3、 长度小于80的包&#xff0c;frame.len < 80 Ip.src 数据包的发送源IP地…...

Thinkphp 6.0多语言

本节课我们来学习一下如何配置的多语言功能&#xff0c;并实现调用方法。 一&#xff0e;多语言 1. 如果要开启多语言切换功能&#xff0c;中间件定义文件 middleware.php 开启&#xff1b; // 多语言加载 \think\middleware\LoadLangPack::class, 2. 配置文件在 config/lang…...

生成式AI已形成全球性“AI再造业务”趋势

3月28日至31日&#xff0c;博鳌亚洲论坛2023年年会在海南举行。实体经济与数字经济如何融合发展&#xff0c;产业数字化如何加速向深层次拓展&#xff0c;生成式AI会给产业经济带来哪些变革&#xff1f;这些话题成为今年论坛热点。 百度集团执行副总裁、百度智能云事业群总裁沈…...

kubesphere 安装 skywalking

kubesphere 安装 skywalking 前言 在测试ELK过程中&#xff0c;框架内部使用skywalking来插入的traceId&#xff0c;没有服务端导致Ignored_Trace&#xff0c;先安装下试试skywalking使用效果&#xff0c;后面考了替换为Tlog 先来安装skywalking… 1. 导入helm原 地址&#x…...

乐鑫 × 全国大学生物联网设计竞赛|探究基于 ESP32-S3 的农业革新应用

​​​​​​​ 2023 年全国大学生物联网设计竞赛&#xff08;下简称“竞赛”&#xff09;现已官宣启幕&#xff01;乐鑫科技 (688018.SH) 作为竞赛金牌合作伙伴&#xff0c;将为同学们带来基于 AI SoC ESP32-S3 的独立竞赛任务&#xff0c;并全程提供软硬件开发资源、技术培训…...

【技术分享】华为防火墙多出口接入到Internet

组网需求 如图1所示&#xff0c;FW作为安全网关部署在网络出口&#xff0c;企业分别从ISP1和ISP2租用一条链路。 企业希望访问Server 1的报文从ISP1链路转发&#xff0c;访问Server 2的报文从ISP2链路转发。 当其中一条链路故障时&#xff0c;后续流量可以通过另一条链路转发…...

Winnolin绘制药时曲线图C-T

文章目录前言一、各受试者C-T图1.导入数据2.设置-运行2.查看结果&#xff0c;修改参数二、各制剂C-T图1.导入数据2.设置-运行2.查看结果&#xff0c;修改参数三、平均C-T图1.计算统计量2.设置统计量计算参数&#xff08;Set Up&#xff09;3.绘图XY Plot4.查看结果&#xff0c;…...

Kafka系列——详解如何使用和配置生产者实现可靠的消息发送

在可靠的系统里使用生产者 即使我们尽可能把 broker 配置得很可靠&#xff0c;但如果没有对生产者进行可靠性方面的配置&#xff0c;整个系统仍然有可能出现突发性的数据丢失。 比如下面的两个例子&#xff1a; &#xff08;一&#xff09;为 broker 配置了 3 个副本&#xff0…...

wordpres漏洞扫描器——wpscan

WordPress 使用PHP语言开发的博客平台 WordPress是使用PHP语言开发的博客平台&#xff0c;用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站。也可以把 WordPress当作一个内容管理系统&#xff08;CMS&#xff09;来使用。 WordPress是一款个人博客系统&#xff0c…...

代码随想录_二叉树_leetcode112、113

leetcode112 路径总和 112. 路径总和 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum 。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返…...

mongo-db相关方法

一、参数 名称描述db.adminCommand()针对admin数据库运行命令。db.aggregate()运行不需要基础集合的管理/诊断管道。db.cloneDatabase(hostname)不推荐使用。当针对MongoDB 4.0或更早版本运行时&#xff0c;将数据库从远程主机复制到当前主机。针对MongoDB 4.2或更高版本运行时…...

《Vue3实战》 第二章 创建项目和目录结构

1、创建项目 1.1、命令格式&#xff1a;vue create 项目名称 vue create vue3_example0011.2、运行项目 npm run serve1.2.1、增加run命令 启动时想修改命令&#xff0c;例如&#xff1a; npm run dev1、找到项目根路径下的package.json文件&#xff1b; 2、找到【scripts…...

13433元!上海一季度平均薪酬出炉!你拖后腿了吗?(附招聘岗位)

2023年第一季度智联招聘&#xff0c; 发布《中国企业招聘薪酬报告》&#xff0c; 显示上海平均招聘薪酬为 13433元/月&#xff01;&#xff01;&#xff01; 13433元/月&#xff01;&#xff01;&#xff01; 13433元/月&#xff01;&#xff01;&#xff01; ☟ ☟ ☟ 同…...

leetcode剑指 Offer 16. 数值的整数次方

题目描述解题思路执行结果leetcode .题目描述 实现 pow(x, n) &#xff0c;即计算 x 的 n 次幂函数&#xff08;即&#xff0c;xn&#xff09;。不得使用库函数&#xff0c;同时不需要考虑大数问题。 示例 1&#xff1a; 输入&#xff1a;x 2.00000, n 10 输出&#xff1a;1…...

漏洞挖掘相关-信息收集

一、常见端口以及漏洞 1.FTP&#xff1a;文件传输协议 TCP端口20、21&#xff0c;20用于传输数据&#xff0c;21用于传输控制信息 (1) ftp基础爆破: owasp的Bruter,hydra以及msf中的ftp爆破模块。 (2) ftp匿名访问:用户名: anonymous密码:为空或者任意邮箱 (3) vsftpd后门: …...

海外分支如何加速访问国内总部办公系统?海域网发布 Sea-WAN解决方案

近年来&#xff0c;一大批优秀的中国企业走向世界&#xff0c;品牌越来越响亮&#xff0c;海外影响力越来越大&#xff0c;比如名创优品&#xff0c;国货之光“花西子”&#xff0c;安科创新等&#xff0c;很多企业在海外设立分支机构为当地客户服务&#xff0c;与此同时&#…...

InsForge:基于Python的Instagram内容自动化创作与发布工具全解析

1. 项目概述与核心价值最近在折腾一个挺有意思的开源项目&#xff0c;叫InsForge。这名字听起来有点“工业锻造”的味道&#xff0c;实际上&#xff0c;它是一个专注于Instagram内容创作与自动化的工具集。简单来说&#xff0c;它试图帮你解决在Instagram上创作、发布、管理内容…...

单元体幕墙计算方法研究

单元体幕墙计算方法研究 一、单元板块计算 选择隔离的单个单元进行计算,不需要考虑周边单元的影响。 单元之间的相互影响,来自于左右立柱的变形不一致,在截面选择上反应的就是左右立柱的截面参数的不同。 所以,单元间的相互影响,可以通过控制左右立柱截面参数的相近而进…...

3DS游戏格式转换神器:5分钟让.3ds文件变身为可安装的CIA

3DS游戏格式转换神器&#xff1a;5分钟让.3ds文件变身为可安装的CIA 【免费下载链接】3dsconv Python script to convert Nintendo 3DS CCI (".cci", ".3ds") files to the CIA format 项目地址: https://gitcode.com/gh_mirrors/3d/3dsconv 还在为…...

AI Agent执行链路的安全机制:权限控制与沙箱隔离方案

AI Agent执行链路安全深度解析:权限控制与沙箱隔离全栈落地方案 摘要/引言 你有没有遇到过这些场景:刚上线的企业内部运维Agent被恶意Prompt注入后,直接调用了删除生产库的工具;你做的数据分析Agent被诱导执行了恶意Python代码,把公司的用户隐私数据传到了境外黑客服务器…...

基于Kubernetes Lease构建分布式部署锁:解决CI/CD环境下的资源竞争

1. 项目概述&#xff1a;从“clawfight”看一场被遗忘的社区技术博弈看到“2019-02-18/clawfight”这个标题&#xff0c;很多人的第一反应可能是困惑。它不像一个标准的软件项目名&#xff0c;没有清晰的版本号&#xff0c;也没有指明具体的技术栈。但恰恰是这种看似随意的命名…...

ViewTurbo:基于响应式依赖追踪的前端渲染优化方案

1. 项目概述与核心价值最近在折腾一个挺有意思的开源项目&#xff0c;叫 ViewTurbo。这名字听起来就带点“涡轮增压”的劲儿&#xff0c;事实上&#xff0c;它也确实是一个旨在为视图渲染“加速”的工具。简单来说&#xff0c;ViewTurbo 的核心目标&#xff0c;是解决在复杂前端…...

开源AI应用开发平台TaskingAI:从RAG智能体到工作流编排实战

1. 项目概述&#xff1a;一个开源的AI应用开发平台最近在折腾AI应用开发的朋友&#xff0c;估计都绕不开一个核心痛点&#xff1a;想法很丰满&#xff0c;落地很骨感。你想做个智能客服、一个文档分析助手&#xff0c;或者一个个性化的内容生成工具&#xff0c;从模型调用、流程…...

【仅开放72小时】ElevenLabs德文语音生成高级提示词库(含137个Schwäbisch/Bavarian方言指令模板)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;ElevenLabs德文语音生成技术概览与方言适配价值 ElevenLabs 的德语语音合成引擎基于多说话人、多风格的端到端扩散模型架构&#xff0c;支持高保真、低延迟的实时语音生成。其德语语音库覆盖标准高地德…...

AI应用开发实战:从RAG系统到多模型API调用的开源项目解析

1. 项目概述&#xff1a;一个AI项目的开源实践最近在GitHub上看到一个名为“hferello/ai”的项目&#xff0c;这个标题非常简洁&#xff0c;甚至可以说有些“神秘”。乍一看&#xff0c;它可能是一个关于人工智能的通用仓库&#xff0c;但点进去之后&#xff0c;你会发现它远不…...

Python驱动GitHub Actions状态监控:打造物理信号塔灯实时反馈CI/CD流水线

1. 项目概述与核心价值在团队协作开发中&#xff0c;持续集成与持续部署&#xff08;CI/CD&#xff09;的流水线状态是项目健康度的“晴雨表”。我们每天都会频繁地提交代码、触发构建&#xff0c;然后盯着GitHub Actions页面上那些或绿或红的标记。但问题在于&#xff0c;这种…...