线程安全的集合类(ArrayList、Hash)

1.多线程环境使用ArrayList

原来的集合类大部分都不是线程安全的,那在多线程情况下该如何使用呢?

  • 自行加锁。分析清楚,要把哪些代码打包到一起,成为一个原子操作。
  • collections.synchronizedList(new AtrrayList)
    这其实就是一个套壳,返回的List各个关键方法都是带有synchronized,不建议使用
  • 使用CopyOnWriteArrayList,不去加锁就不会产生阻塞。但是这个方法也有明显的缺点,数组特别大,非常低效;如果多个线程同时修改也会容易出问题。在服务器进行重新加载配置的时候比较适合使用这种方法。什么是配置,配置就是我们打开一个程序的时候设置的画质、声音。但是此时服务器正在运行,正常来说修改的配置文件不能立即生效需要重启一下服务器。很多服务器提供配置重加载(reload),配置就是被读取到服务器的内存中,以数组、哈希存储,服务器代码中其他的逻辑就会读取到这些数组、哈希的值。此时程序员手动修改配置文件之后,手动触发reload功能,服务器就会创建新的数组、哈希加载新的配置。加载完毕之后使用新配置代替旧配置。

利用的是写时拷贝思想。当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行copy,复制出一个新的容器,复制过程中如果有其他线程在读就直接读取旧版本的数据,虽然复制过程不是原子的但是提供的是旧版本不影响其他线程读取,然后在新的容器添加元素同时把引用由旧数组指向新数组。

 2.多线程环境使用哈希表

HashMap本身不是线程安全的,在多线程环境下可以使用哈希如下:

1.Hashtable(线程安全的给各种public方法都加synchronized,但是不推荐使用)

2.ConcurrentHashMap(效率更高:按照桶级别进行加锁,而不是给整个哈希加一个全局锁,有效降低锁冲突的概率)优势如下:

  • 读操作没有加锁,只对写操作进行加锁,加锁的方式仍然是用synchronized,但是不是整个锁对象而是锁桶(用每个链表的头节点作为锁对象),大大降低了锁冲突的概率。

我们先来介绍一下普通的hash,hash表的构造是通过取余的方式来获取数组下标,但是这样会出现锁冲突。为了解决这个冲突有两种方法,一是线性探测,而是链表。线性探测不太靠谱,在实际开发中一般采用链表的形式。如果链表太长了就需要扩容比如使用红黑树。在普通的hash链表如果有两个线程访问任意两个不同的元素(同一个链表中)都会产生锁竞争。在这种情况下,ConcurrentHashMap就在每个链表的头结点进行加锁。在实际开发中,用到的Hash表很可能比较大(桶有很多个),即使多线程访问上述的Hash表,同一时刻两个线程恰好访问同一个链表的可能性概率比较低。

  • 充分利用CAS特性原子类,比如size通过CAS来更新,避免出现重量级锁的情况,比如两个线程同时修改size的情况
  • 优化了扩容方式:化整为零,确保每个操作的加锁时间不要太长。扩容操作意味着需要更大的数组,把旧哈希中的所有元素搬运到新的哈希中(元素很长,耗时很长),假设某个插入操作,触发了扩容 进行搬运,搬运过程中就需要进行更长时间加锁了。但是这里不采用一口气搬运所有的元素,而是把整个搬运拆成多次来完成,一旦触发了“扩容”不是通过一次put来完成的而是通过多次put、get来操作完成。

1.发现需要扩容的线程,只需创建一个新的数组,同时只搬几个元素过去

2.扩容期间,新老数组同时存在

3.后续每个来操作ConcurrenthHashMap的线程,都会参与搬家的过程,每个操作负责搬运一小部分元素

4.搬完最后一个元素再把老元素删除,这个期间插入只往新数组加,这个期间查抄需要同时查新数组和老数组。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/17986.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【含开题报告+文档+PPT+源码】基于SpringBoot+Vue的智能蒙绮英语学习系统设计与实现

开题报告 随着全球化的不断深入,英语作为国际通用语言,其重要性日益凸显。掌握英语不仅可以拓宽个人的视野和知识面,还可以增强个人竞争力,为个人职业发展带来更多机会。因此,开发一款能够帮助用户更高效地学习英文单…

Blender vs 3dMax谁才是3D软件的未来?

在探讨Blender与3ds Max谁才是3D软件的未来时,我们需要从多个维度对这两款软件进行详细分析。 Blender的优势 开源免费:Blender是一款完全免费的开源3D创作套件,这使得它成为独立艺术家、业余爱好者和小型工作室的首选。用户无需承担巨额的…

ubuntu安装cuda、cudnn和TensoRT【分步安装】

我说实话,这个环境安装真的要了老命,太tm恶心了。 因为遇到了很多问题,非常之恶心 问题一:版本对应 问题二:下载具慢 问题三:上NVIDIA有时候上不去 问题四:找到对应版本点不了 问题五&…

基于树莓派的边缘端 AI 目标检测、目标跟踪、姿态估计 视频分析推理 加速方案:Hailo with ultralytics YOLOv8 YOLOv11

文件大纲 加速原理硬件安装软件安装基本设置系统升级docker 方案Demo 测试目标检测姿态估计视频分析参考文献前序树莓派文章hailo加速原理 Hailo 发布的 Raspberry Pi AI kit 加速原理,有几篇文章介绍的不错 https://ubuntu.com/blog/hackers-guide-to-the-raspberry-pi-ai-ki…

网络工程实验一:静态路由的配置

#实验仅供参考,勿直接粘贴复制,用以学习交流# 1、实验目的: 熟悉eNSP网络仿真工具平台。 掌握静态路由配置方法。 能够配置路由器接口地址。 2、实验内容: 2.1、安装对应的软件: (1)Virtual …

基于java的宠物用品交易平台

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 数据…

华为VPN技术

1.启动设备 2.配置IP地址 [FW1]int g1/0/0 [FW1-GigabitEthernet1/0/0]ip add 192.168.1.254 24 [FW1-GigabitEthernet1/0/0]int g1/0/1 [FW1-GigabitEthernet1/0/1]ip add 100.1.1.1 24 [FW1-GigabitEthernet1/0/1]service-manage ping permit [FW2]int g1/0/0 [FW2-Gi…

鸿蒙进阶篇-数组常用方法(一)

大家好,这里是鸿蒙开天组,今天咱们来学习一下数组的常用方法。 数组在编程中是非常常见的数据类型,毕竟需要用到的场合太多了,所以我们今天来使劲学习一下常用方法,在这里也没法一一列全,但是大家也可以根…

整数唯一分解定理

整数唯一分解定理,也称为算术基本定理,是由德国数学家高斯在其著作《算术研究》中首次提出的。本文回顾整数唯一分解定理以及对应的几个重要结论。 一、整数唯一分解定理 整数唯一分解定理,也称为算术基本定理,是数论中的一个重…

对Pod做一个详细了解

文章目录 01创建一个pod02删除pod03镜像拉取策略04pod的标签05pod资源限制方法06pod的重启策略 07pod中运行多个容器08对pod内的容器执行命令09 验证多个pod中多个容器网络共享10 pod的创建流程和调度的约束方式pod的声明周期介绍pod 的健康检查健康检查的方式probe的探测方式案…

LinkedHashMap实现LRU

LRU 环境:JDK11 最近接触LRU(Least Recently Used),即最近最少使用,也称淘汰算法,在JDK中LinkedHashMap有相关实现 LRU的LinkedHashMap实现 LinkedHashMap继承HashMap。所以内存的存储结构和HashMap一样,但是LinkedH…

基于rk356x u-boot版本功能分析及编译相关(三)Makefile分析

🎏技术驱动源于热爱,祝各位学有所成。 文章目录 一、Makefile简要概述二、简要流程图三、Makefile文件具体分析大家好哈,这次因工作比较忙,文章更新拖的有些久了。哈哈,话不多说,咱们接着上次继续说u-boot的Makefile。 一、Makefile简要概述 一般要了解u-boot源码的编译…

shell(1)脚本创建执行与变量使用

shell(1)脚本创建执行与变量使用 声明! 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章 笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流&…

第5章总体设计-5.4 硬件可行性分析

5.4 硬件可行性分析 5.4.1 硬件方案评估1. 框式产品硬件可行性分析(1)机框设计可行性。(2)单板设计可行性。(3)核心功能器件选型。(4)数据流。 2. 盒式产品硬件可行性分析3. 终端产品…

TOIS24|推荐公平性的反事实解释

论文:https://arxiv.org/pdf/2307.04386 代码:https://anonymous.4open.science/r/CFairER-anony/. 关键词:可解释推荐;公平;反事实的解释;强化学习 1 动机 现有推荐系统存在的公平性问题,例如性别歧视和种族偏见等,…

week 3 - Assembly Language

Important Instructions and Syntax 此内容是以MASM编写的,你将使用Visual C/C内联汇编来编程,因此数据元素的声明有所不同,但概念和指令集(instruction sets)相同。 一、General-Purpose Registers 寄存器是CPU内的命名存储单元…

6.C操作符详解,深入探索操作符与字符串处理

C操作符详解,深入探索操作符与字符串处理 C语言往期系列文章目录 往期回顾: C语言是什么?编程界的‘常青树’,它的辉煌你不可不知VS 2022 社区版C语言的安装教程,不要再卡在下载0B/s啦C语言入门:解锁基础…

校园导航系统

关于数据结构的一个整理: 1、链式有序表的合并 2、栈 3、队列 4、二叉树、哈夫曼报文 5、图论 6、十大排序 7、校园导航系统 文章目录 校园导航系统演示示例代码示例1、弧结点和顶点节点2、Map节点3、用户 校园导航系统 采用C语言涉及了数据库相关的操作&am…

食品进出库库存管理发货开单软件下载 佳易王食品进出库管理系统操作教程

一、概述 【软件资源下载在文章最后】 食品进出库库存管理发货开单软件下载 食品进出库管理系统操作教程 商品进出库管理软件是一款操作简便的进出库管理软件,管理入库,出库,库存,同时打印发货单。 二、软件操作教程 第一步&a…