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

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务&#xff1a; test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?

在工业自动化持续演进的今天&#xff0c;通信网络的角色正变得愈发关键。 2025年6月6日&#xff0c;为期三天的华南国际工业博览会在深圳国际会展中心&#xff08;宝安&#xff09;圆满落幕。作为国内工业通信领域的技术型企业&#xff0c;光路科技&#xff08;Fiberroad&…...

「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案

在移动互联网营销竞争白热化的当下&#xff0c;推客小程序系统凭借其裂变传播、精准营销等特性&#xff0c;成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径&#xff0c;助力开发者打造具有市场竞争力的营销工具。​ 一、系统核心功能架构&…...

【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL

ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...