当前位置: 首页 > 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;与此同时&#…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三&#xff0c;HubSpot宣布已构建与ChatGPT的深度集成&#xff0c;这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋&#xff0c;但同时也存在一些关于数据安全的担忧。 许多网络声音声称&#xff0c;这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...