多线程环境下如何安全的使用线性表, 队列, 哈希表
小王学习录
- 今日鸡汤
- 安全使用ArrayList
- 安全使用队列
- 安全使用HashMap
今日鸡汤
安全使用ArrayList
- 使用synchronized锁或者reentrantLock锁
- 使用CopyOnWriteArrayList(COW写时拷贝)类来代替ArrayList类.
- 多个线程对CopyOnWriteArrayList里面的ArrayList进行读操作, 不会发生线程安全问题, 不做任何处理
- 多个线程对CopyOnWriteArrayList里面的ArrayList进行写操作, 会为每个线程创建一个副本, 各个线程在各自独立的副本上进行修改, 最后
不会进行汇总,最后一个完成写操作的副本将会代替旧的ArrayList(牺牲了实时性来确保线程安全). 如果在写操作期间有线程对其进行读操作, 会读旧的(修改之前的)ArrayList.本质上是引用之间的赋值. 这种方法适用于读频繁, 不经常写入的情况. 如服务器的配置文件.- CopyOnWriteArrayList的局限性在于:
(1)牺牲了实时性, 同时多个线程进行写操作时之会将最后一个完成写操作的副本代替原来的ArrayList, 而率先完成写操作的副本将会作废, 也因此这种方法只适用于读频繁而不经常写的情况
(2) 这种方法也只适用于ArrayList较小的情况, 否则在创建副本时将会付出巨大的开销.
(3) 服务器的配置文件就是采用这种写时拷贝的方式来对配置文件进行修改的, 这个功能叫热加载
安全使用队列
- 基于数组实现的阻塞队列
ArrayBlockingQueue
- 基于链表实现的阻塞队列
LinkedBlockingQueue
- 基于堆实现的带优先级的阻塞队列
PriorityBlockingQueue
- 最多只包含一个元素的阻塞队列
TransferQueue
安全使用HashMap
- 使用HasHTable代替HashMap, HashTable中的关键方法进行了上锁, 使用时是线程安全的
- 使用ConcurrentHashMap代替HashMap
ConcurrentHashMap和HashTable的区别:
- ConcurrentHashMap的
锁粒度更小, 锁冲突发生的概率小.
HashTable的锁对象是整个哈希表, 这就意味着对哈希表中的任何元素进行操作都会上锁, 但是有些操作是不需要上锁的.
而ConcurrentHashMap的锁对象是单个链表, 这就大大细化了锁的粒度, 大大减小了发生锁冲突的概率, 且提高了性能
- ConcurrentHashMap
对读操作不上锁, 只对写操作上锁. 通过volatile关键字+原子操作写来确保边读边写的线程安全, 避免脏读的发生.- ConcurrentHashMap使用了
CAS操作, 尽量减少上锁的操作. 提高并发性能.- 在
扩容方面, ConcurrentHampMap使用了化整为零的方式.
(1) HashTable在进行扩容时, 容量扩为原来的两倍, 将原哈希表中的数据复制到新表中, 因为其是对整个哈希表上锁, 所以在整个哈希表未完成扩容时, 对其的读写操作都会陷入阻塞, 这大大降低了性能
(2) ConcurrentHashMap在扩容时, 由于锁对象是链表, 所以在进行数据迁移时, 各个链表可以独立迁移, 这样在一次迁移中只对正在迁移的链表上锁, 针对其他链表的读写操作还可以执行.
如果要执行put操作, 则直接在新的哈希表中添加
如果要执行take操作, 则对原哈希表和新哈希表都进行检索
直到新哈希表扩容完成(数据全部迁移), 再释放旧的哈希表.
相关文章:
多线程环境下如何安全的使用线性表, 队列, 哈希表
小王学习录 今日鸡汤安全使用ArrayList安全使用队列安全使用HashMap 今日鸡汤 安全使用ArrayList 使用synchronized锁或者reentrantLock锁使用CopyOnWriteArrayList(COW写时拷贝)类来代替ArrayList类. 多个线程对CopyOnWriteArrayList里面的ArrayList进行读操作, 不会发生线程…...
机器人SLAM与自主导航
机器人技术的迅猛发展,促使机器人逐渐走进了人们的生活,服务型室内移动机器人更是获得了广泛的关注。但室内机器人的普及还存在许多亟待解决的问题,定位与导航就是其中的关键问题之一。在这类问题的研究中,需要把握三个重点&#…...
Zookeeper集群 + Kafka集群的详细介绍与部署
文章目录 1. Zookeeper 概述1.1 简介1.2 Zookeeper的工作机制1.3 Zookeeper 主要特点1.4 Zookeeper 数据结构1.5 Zookeeper的相关应用场景1.5.1 统一命名服务1.5.2 统一配置管理1.5.3 统一集群管理1.5.4 服务器动态上下线1.5.5 软负载均衡 1.6 Zookeeper 选举机制1.6.1 第一次启…...
STP、堆叠与VRRP如何使用
✍ STP生成树用在哪里? ✍ STP和堆叠有什么区别? ✍ VRRP双网关热备份如何部署? --- 通过交换机组成网络是局域网,连接终端设备的交换机就是接入层交换机。 --- 如上组网结构单一,不需要网工。 容易发生单点故障&…...
Go 函数的健壮性、panic异常处理、defer 机制
Go 函数的健壮性、panic异常处理、defer 机制 文章目录 Go 函数的健壮性、panic异常处理、defer 机制一、函数健壮性的“三不要”原则1.1 原则一:不要相信任何外部输入的参数1.2 原则二:不要忽略任何一个错误1.3 原则三:不要假定异常不会发生…...
Maven的详细介绍(maven的全据配置以及idea中maven的配置)
maven的理解 Maven 是一个强大的项目管理和构建自动化工具,它通过抽象的项目对象模型(POM:Project Object Model)和构建生命周期模型(Project Lifecycle)来对项目及其构建过程进行管理(Dependency Management System),Maven 最大化的消除了构…...
Qt中Json的操作
在 Json的两种格式中介绍了Json的格式以及应用场景。由于这种数据格式与语言无关,下面介绍一下Json在Qt中的使用。 从Qt 5.0开始提供了对Json的支持,我们可以直接使用Qt提供的Json类进行数据的组织和解析。相关的类常用的主要有四个,具体如下: Json类介绍 QJsonDocument |…...
10. 机器学习-评测指标
Hi,你好。我是茶桁。 之前的课程中,我们学习了两个最重要的回归方法,一个线性回归,一个逻辑回归。也讲解了为什么学习机器学习要从逻辑回归和线性回归讲起。因为我们在解决问题的时候,有限选择简单的假设,越复杂的模型…...
SAP-QM-动态检验规则
Dynamic Modification Rule (动态修改规则) 1、决定样本大小的方式有3种: 手动输入比例大小采样过程 物料主数据质量视图 2、采样过程的创建方式有2种 跟批量大小有关系:百分比/AQL跟批量大小没有关系:固定值 而当…...
CCC数字钥匙设计【NFC】--NFC卡相关基础知识
CCC3.0的NFC技术中,除车端,手机端需包含NFC功能外,另外一般还会配置一个NFC卡,用于备份使用。本文主要介绍NFC卡相关的基础知识。 1、NFC卡 & 智能卡 NFC卡是一种智能卡,其与信用卡大小相同,可通过嵌入…...
SpringMVC(第一个项目HelloWorld))
文章目录 1.在maven引入依赖2.配置web.xml3.创建请求控制器4.创建springMVC的配置文件5.测试HelloWorld总结 1.在maven引入依赖 <dependencies><!-- SpringMVC --><dependency><groupId>org.springframework</groupId><artifactId>spring…...
GEO生信数据挖掘(九)肺结核数据-差异分析-WGCNA分析(900行代码整理注释更新版本)
第六节,我们使用结核病基因数据,做了一个数据预处理的实操案例。例子中结核类型,包括结核,潜隐进展,对照和潜隐,四个类别。第七节延续上个数据,进行了差异分析。 第八节对差异基因进行富集分析。…...
二进制明文字符串加密:实现原理
二进制明文字符串加密:实现原理 背景 这里就不多做解释了,明文字符串暴露就是最好的逆向分析指引。无论是恶意攻击样本还是有一定安全需求的组件,直接暴露程序中的明文字符串会大幅降低外部的分析成本。所以需要在编译出的二进制中隐藏字符串。不过需要…...
免费SSL证书:JoySSL让您的网站更安全
在今天的数字化时代,保护网站和用户信息的安全至关重要。SSL(Secure Sockets Layer)证书通过加密网站与用户之间的通信,确保数据传输的安全性。让您拥有一个SSL加密的网站是至关重要的,但您可能会担心高昂的费用。不过…...
JavaPTA练习题 7-3 打印99乘法表
打印99乘法表 输入样例: 不需要输入 输出样例: 在这里给出相应的输出。要求:99乘法表中,每个表达式的乘法结果长度为3。 1x11 2x12 2x24 3x13 3x26 3x39 4x14 4x28 4x312 4x416 5x15 5x210 5x315 5x420 5x525 6x16 6x212 6x318 6x424…...
k8s-20 hpa控制器
hpa可通过metrics-server所提供pod的cpu 或者内存的负载情况,从而动态拉伸控制器的副本数,从而达到后端的自动弹缩 官网:https://kubernetes.io/zh-cn/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/ 上传镜像 压测 po…...
操作系统【OS】操作系统的引导
激活CPU。 激活的CPU读取ROM中的boot程序,将指令寄存器置为BIOS(基本输入输出系统)的第一条指令, 即开始执行BIOS的指令。硬件自检。 启动BIOS程序后,先进行硬件自检,检查硬件是否出现故障。如有故障,主板会发出不同含…...
PHP的四层架构
PHP的4层架构是一种软件设计模式,用于将一个PHP应用程序划分为不同的层次,以实现解耦、可扩展和易于维护的代码结构。这个架构通常由以下四个层次组成: 1、 表现层(Presentation Layer): 表现层是与用户直…...
Kafka存取原理与实现分析,打破面试难关
系列文章目录 上手第一关,手把手教你安装kafka与可视化工具kafka-eagle Kafka是什么,以及如何使用SpringBoot对接Kafka 架构必备能力——kafka的选型对比及应用场景 Kafka存取原理与实现分析,打破面试难关 系列文章目录一、主题与分区1. 模型…...
JavaWeb——IDEA相关配置(Tomcat安装)
3、Tomcat 3.1、Tomcat安装 可以在国内一些镜像网站中下载Tomcat,同样也可以在[Tomcat官网](Apache Tomcat - Welcome!)下载 3.2、Tomcat启动和配置 一些文件夹的说明 启动,关闭Tomcat 启动:Tomcat文件夹→bin→startup.bat 关闭&#…...
【技术解析】ABLIC S-8254A:如何为3/4串锂电池构筑高精度“安全网”?
1. ABLIC S-8254A:锂电池安全的“智能守门人” 想象一下,你手里拿着一块由3节或4节锂电池串联组成的电池组,就像握着一把双刃剑——它能提供强劲动力,但也潜藏着过充爆炸、过放报废的风险。这时候,S-8254A就像一位24小…...
VERIMOA框架:大语言模型在硬件设计自动化的创新应用
1. VERIMOA框架概述:硬件设计自动化的新范式在半导体行业面临前所未有的性能压力背景下,寄存器传输级(RTL)设计的自动化已成为芯片开发流程中的关键环节。传统硬件描述语言(HDL)编写过程高度依赖工程师的专…...
机械键盘、人体工学椅是智商税吗?
机械键盘、人体工学椅是智商税吗? 在数码和办公设备领域,机械键盘和人体工学椅常被贴上“高端”“专业”的标签,价格也远高于普通产品。有人觉得它们是提升效率的神器,也有人质疑这是商家制造的“智商税”。究竟这些产品是物有所…...
Z2晶格规范理论中的排斥性束缚态研究
1. 研究背景与核心发现 在凝聚态物理和量子场论的交叉领域,晶格规范理论作为研究强相互作用系统的重要工具,近年来展现出惊人的生命力。这项发表在arXiv预印本平台的工作,由Rice大学和马克斯普朗克研究所的联合团队完成,他们通过前…...
fre:ac音频转换器终极指南:5分钟学会免费批量转换MP3、FLAC、AAC
fre:ac音频转换器终极指南:5分钟学会免费批量转换MP3、FLAC、AAC 【免费下载链接】freac The fre:ac audio converter project 项目地址: https://gitcode.com/gh_mirrors/fr/freac 你是否曾经遇到过音乐格式不兼容的烦恼?下载的歌曲无法在手机播…...
Qwen3-4B-Thinking效果展示:多跳推理问题(如‘谁的导师是X的学生’)
Qwen3-4B-Thinking效果展示:多跳推理问题(如谁的导师是X的学生) 1. 模型简介与部署 Qwen3-4B-Thinking-2507-Gemini-2.5-Flash-Distill是一款专注于复杂推理任务的文本生成模型。该模型在大约5440万个由Gemini 2.5 Flash生成的token上进行了…...
用Python和MATLAB复现蝴蝶优化算法(BOA):从原理到代码的保姆级教程
蝴蝶优化算法(BOA)全流程实战:Python与MATLAB双版本代码精解 蝴蝶优化算法(Butterfly Optimization Algorithm, BOA)作为新兴的群体智能算法,凭借其独特的生物行为模拟机制和简洁的参数结构,在工程优化、机器学习等领域展现出独特优势。本文将…...
BERT命名实体识别实战:从原理到Hugging Face实现
1. 基于BERT的命名实体识别实战指南命名实体识别(NER)是自然语言处理中的一项基础任务,它能从非结构化文本中识别出人名、地名、组织机构名等特定类别的实体。想象一下,当你阅读"微软CEO萨提亚纳德拉在西雅图的会议上发言&qu…...
告别盲调!用CubeMX图形化配置STM32F4时钟树,并自动生成HAL代码
图形化配置STM32F4时钟树的实战指南:从CubeMX到代码生成 第一次接触STM32的时钟树配置时,我盯着参考手册里密密麻麻的时钟路径图和一堆分频系数发愣。作为从51单片机转过来的开发者,这种复杂度让我一度想放弃HAL库。直到发现了CubeMX这个神器…...
别再傻等HAL_Delay了!手把手教你给STM32写个精准的微秒延时函数(附GPIO驱动避坑指南)
突破HAL库限制:STM32微秒级延时实战指南与GPIO时序优化 从HAL_Delay的局限到精准时序控制 在嵌入式开发中,精确的时序控制往往是成败的关键。当我们需要驱动WS2812全彩LED、超声波传感器或实现软件串口通信时,微秒级的延时精度变得至关重要。…...

而ConcurrentHashMap的锁对象是单个链表, 这就大大细化了锁的粒度, 大大减小了发生锁冲突的概率, 且提高了性能