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 常用命令: frame.len 帧数据总长度:包含MAC头IP头UDP头UDP数据 eg: 1、 重传命令的长度是62, Frame.len 62 2、 长度大于200的包,frame.len > 200 3、 长度小于80的包,frame.len < 80 Ip.src 数据包的发送源IP地…...
Thinkphp 6.0多语言
本节课我们来学习一下如何配置的多语言功能,并实现调用方法。 一.多语言 1. 如果要开启多语言切换功能,中间件定义文件 middleware.php 开启; // 多语言加载 \think\middleware\LoadLangPack::class, 2. 配置文件在 config/lang…...

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

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

乐鑫 × 全国大学生物联网设计竞赛|探究基于 ESP32-S3 的农业革新应用
2023 年全国大学生物联网设计竞赛(下简称“竞赛”)现已官宣启幕!乐鑫科技 (688018.SH) 作为竞赛金牌合作伙伴,将为同学们带来基于 AI SoC ESP32-S3 的独立竞赛任务,并全程提供软硬件开发资源、技术培训…...

【技术分享】华为防火墙多出口接入到Internet
组网需求 如图1所示,FW作为安全网关部署在网络出口,企业分别从ISP1和ISP2租用一条链路。 企业希望访问Server 1的报文从ISP1链路转发,访问Server 2的报文从ISP2链路转发。 当其中一条链路故障时,后续流量可以通过另一条链路转发…...

Winnolin绘制药时曲线图C-T
文章目录前言一、各受试者C-T图1.导入数据2.设置-运行2.查看结果,修改参数二、各制剂C-T图1.导入数据2.设置-运行2.查看结果,修改参数三、平均C-T图1.计算统计量2.设置统计量计算参数(Set Up)3.绘图XY Plot4.查看结果,…...
Kafka系列——详解如何使用和配置生产者实现可靠的消息发送
在可靠的系统里使用生产者 即使我们尽可能把 broker 配置得很可靠,但如果没有对生产者进行可靠性方面的配置,整个系统仍然有可能出现突发性的数据丢失。 比如下面的两个例子: (一)为 broker 配置了 3 个副本࿰…...

wordpres漏洞扫描器——wpscan
WordPress 使用PHP语言开发的博客平台 WordPress是使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站。也可以把 WordPress当作一个内容管理系统(CMS)来使用。 WordPress是一款个人博客系统,…...

代码随想录_二叉树_leetcode112、113
leetcode112 路径总和 112. 路径总和 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返…...
mongo-db相关方法
一、参数 名称描述db.adminCommand()针对admin数据库运行命令。db.aggregate()运行不需要基础集合的管理/诊断管道。db.cloneDatabase(hostname)不推荐使用。当针对MongoDB 4.0或更早版本运行时,将数据库从远程主机复制到当前主机。针对MongoDB 4.2或更高版本运行时…...

《Vue3实战》 第二章 创建项目和目录结构
1、创建项目 1.1、命令格式:vue create 项目名称 vue create vue3_example0011.2、运行项目 npm run serve1.2.1、增加run命令 启动时想修改命令,例如: npm run dev1、找到项目根路径下的package.json文件; 2、找到【scripts…...

13433元!上海一季度平均薪酬出炉!你拖后腿了吗?(附招聘岗位)
2023年第一季度智联招聘, 发布《中国企业招聘薪酬报告》, 显示上海平均招聘薪酬为 13433元/月!!! 13433元/月!!! 13433元/月!!! ☟ ☟ ☟ 同…...
leetcode剑指 Offer 16. 数值的整数次方
题目描述解题思路执行结果leetcode .题目描述 实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题。 示例 1: 输入:x 2.00000, n 10 输出:1…...

漏洞挖掘相关-信息收集
一、常见端口以及漏洞 1.FTP:文件传输协议 TCP端口20、21,20用于传输数据,21用于传输控制信息 (1) ftp基础爆破: owasp的Bruter,hydra以及msf中的ftp爆破模块。 (2) ftp匿名访问:用户名: anonymous密码:为空或者任意邮箱 (3) vsftpd后门: …...
海外分支如何加速访问国内总部办公系统?海域网发布 Sea-WAN解决方案
近年来,一大批优秀的中国企业走向世界,品牌越来越响亮,海外影响力越来越大,比如名创优品,国货之光“花西子”,安科创新等,很多企业在海外设立分支机构为当地客户服务,与此同时&#…...

国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...

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

Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...

Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...

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