线程安全集合类概述

2023-10-26

HashTable和Vector

遗留的线程安全实现:效率较低
	HashTable:map的实现
	Vector:list的实现

Collections中的带synchronized修饰实现类

如synchronizedMap。synchronizedList等
方法内部都加一个synchronized修饰,同步块中调用原来的方法。属于装饰器模式,对原来的List或者Map功能进行装饰

JUC

java.util.concurrent.*下面的集合类
	主要分为三类:
		Blocking类:大部分实现基于锁,并提供用来阻塞的方法
		CopOnWrite:拷贝后修改,容器修改开销相对较重
		Concurrent:
			内部很多操作使用 cas 优化,一般可以提供较高吞吐量
			弱一致性
				遍历时弱一致性,例如,当利用迭代器遍历时,如果容器发生修改,迭代器仍然可以继续进行遍历,这时内容是旧的
				求大小弱一致性,size 操作未必是 100% 准确
				读取弱一致性	
			遍历时如果发生了修改,对于非安全容器来讲,使用 fail-fast 机制也就是让遍历立刻失败,抛出ConcurrentModificationException,不再继续遍历

ConcurrentHashMap

原理见java面试题整理中的ConcurrentHashMap,地址:[java面试题](https://blog.csdn.net/MpenggegeM/article/details/123022267?spm=1001.2014.3001.5502)

LinkedBlockingQueue

原理:
	1、对象中维护一个内部Node对象,存放数据item内容,和next指向下一个Node
	2、初始化:生成一个Dummy Node节点,用来占位,item = null,next=null,Queue的head和last都指向这个Dummy对象
	3、入队:将last.next指向新加入的node,将last指向新加入的node;
	4、出队:
		用first变量指向head.next,也就是第一个有值的节点。
		将h=head对象,h.next=h指向自己,方便安全地进行GC
		将first.item赋值给变量返回。first.item又置为null,意思是变为Dummy节点。
		将head指向first
		总体描述就是,获得Dummy后面第一个节点的值,将这个节点置为Dummy,将原来的Dummy垃圾回收;
加锁分析:
	1、生产者消费者使用不同的锁,putlock和takelock
	2、当链表长度只有1个Dummy数据时,takelock的线程会阻塞
	3、当同类型锁await和signal时,如果put还有空位,或者还能take,只signal一个线程进行操作,减少竞争;
性能比较:
	主要列举 LinkedBlockingQueue 与 ArrayBlockingQueue 的性能比较:
		Linked 支持有界,Array 强制有界
		Linked 实现是链表,Array 实现是数组
		Linked 是懒惰的,而 Array 需要提前初始化 Node 数组
		Linked 每次入队会生成新 Node,而 Array 的 Node 是提前创建好的
		Linked 两把锁,Array 一把锁

ConcurrentLinkedQueue

ConcurrentLinkedQueue 的设计与 LinkedBlockingQueue 非常像
	1、两把【锁】,同一时刻,可以允许两个线程同时(一个生产者与一个消费者)执行
	2、dummy 节点的引入让两把【锁】将来锁住的是不同对象,避免竞争
	3、只是这【锁】使用了 cas 来实现

CopyOnWriteArrayList

1、写操作时,进行复制后再操作覆盖。因此不影响读,读线程无需加锁。
2、一般用于读多写少的状况
3、弱一致性,可能读的旧数据
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

线程安全集合类概述 的相关文章

  • 不同帐户上的 Spring Boot、JmsListener 和 SQS 队列

    我正在尝试开发一个 Spring Boot 1 5 应用程序 该应用程序需要侦听来自两个不同 AWS 帐户的 SQS 队列 是否可以使用 JmsListener 注解创建监听器 我已检查权限是否正确 我可以使用 getQueueUrl 获取
  • 在内存中使用 byte[] 创建 zip 文件。 Zip 文件总是损坏

    我创建的 zip 文件有问题 我正在使用 Java 7 我尝试从字节数组创建一个 zip 文件 其中包含两个或多个 Excel 文件 应用程序始终完成 没有任何异常 所以 我以为一切都好 当我尝试打开 zip 文件后 Windows 7 出
  • 动态选择端口号?

    在 Java 中 我需要获取端口号以在同一程序的多个实例之间进行通信 现在 我可以简单地选择一些固定的数字并使用它 但我想知道是否有一种方法可以动态选择端口号 这样我就不必打扰我的用户设置端口号 这是我的一个想法 其工作原理如下 有一个固定
  • 过滤两次 Lambda Java

    我有一个清单如下 1 2 3 4 5 6 7 和 预期结果必须是 1 2 3 4 5 6 7 我知道怎么做才能到7点 我的结果 1 2 3 4 5 6 我也想知道如何输入 7 我添加了i gt i objList size 1到我的过滤器
  • Pig Udf 显示结果

    我是 Pig 的新手 我用 Java 编写了一个 udf 并且包含了一个 System out println 其中的声明 我必须知道在 Pig 中运行时该语句在哪里打印 假设你的UDF 扩展了 EvalFunc 您可以使用从返回的 Log
  • 如何更改javaFX中按钮的图像?

    我正在使用javaFX 我制作了一个按钮并为此设置了图像 代码是 Image playI new Image file c Users Farhad Desktop icons play2 jpg ImageView iv1 new Ima
  • java.lang.IllegalStateException:应用程序 PagerAdapter 更改了适配器的内容,而没有调用 PagerAdapter#notifyDataSetChanged android

    我正在尝试使用静态类将值传递给视图 而不是使用意图 因为我必须传递大量数据 有时我会收到此错误 但无法找出主要原因是什么 Error java lang IllegalStateException The application s Pag
  • 将流转换为 IntStream

    我有一种感觉 我在这里错过了一些东西 我发现自己做了以下事情 private static int getHighestValue Map
  • java.lang.IllegalStateException:提交响应后无法调用 sendRedirect()

    这两天我一直在尝试找出问题所在 我在这里读到我应该在代码中添加一个返回 我做到了 但我仍然得到 java lang IllegalStateException Cannot call sendRedirect after the respo
  • jdbc mysql loginTimeout 不起作用

    有人可以解释一下为什么下面的程序在 3 秒后超时 因为我将其设置为在 3 秒后超时 12秒 我特意关闭了mysql服务器来测试mysql服务器无法访问的这种场景 import java sql Connection import java
  • Spring Boot Data JPA 从存储过程接收多个输出参数

    我尝试通过 Spring Boot Data JPA v2 2 6 调用具有多个输出参数的存储过程 但收到错误 DEBUG http nio 8080 exec 1 org hibernate engine jdbc spi SqlStat
  • java for windows 中的文件图标叠加

    我正在尝试像 Tortoise SVN 或 Dropbox 一样在文件和文件夹上实现图标叠加 我在网上查了很多资料 但没有找到Java的解决方案 Can anyone help me with this 很抱歉确认您的担忧 但这无法在 Ja
  • 使用 AsyncTask 传递值

    我一直在努力解决这个问题 但我已经到了不知道该怎么办的地步 我想做的是使用一个类下载文件并将其解析为字符串 然后将该字符串发送到另一个类来解析 JSON 内容 所有部件都可以单独工作 并且我已经单独测试了所有部件 我只是不知道如何将值发送到
  • 关键字“table”附近的语法不正确,无法提取结果集

    我使用 SQL Server 创建了一个项目 其中包含以下文件 UserDAO java public class UserDAO private static SessionFactory sessionFactory static se
  • Android:无法使用 DbHelper 和 Contract 类将数据插入 SQLite

    public class Main2Activity extends AppCompatActivity private EditText editText1 editText2 editText3 editText4 private Bu
  • 我如何在java中读取二进制数据文件

    因此 我正在为学校做一个项目 我需要读取二进制数据文件并使用它来生成角色的统计数据 例如力量和智慧 它的设置是让前 8 位组成一个统计数据 我想知道执行此操作的实际语法是什么 是不是就像读文本文件一样 这样 File file new Fi
  • Opencv Java 灰度

    我编写了以下程序 尝试从彩色转换为灰度 Mat newImage Imgcodecs imread q1 jpg Mat image new Mat new Size newImage cols newImage rows CvType C
  • 如何将双精度/浮点四舍五入为二进制精度?

    我正在编写对浮点数执行计算的代码的测试 不出所料 结果很少是准确的 我想在计算结果和预期结果之间设置一个容差 我已经证实 在实践中 使用双精度 在对最后两位有效小数进行四舍五入后 结果始终是正确的 但是usually四舍五入最后一位小数后
  • CamcorderProfile.videoCodec 返回错误值

    根据docs https developer android com reference android media CamcorderProfile html 您可以使用CamcorderProfile获取设备默认视频编解码格式 然后将其
  • 如何防止在Spring Boot单元测试中执行import.sql

    我的类路径中有一个 import sql 文件 其中包含一些 INSERT 语句 当使用 profile devel 运行我的应用程序时 它的数据被加载到 postgres 数据库中 到目前为止一切正常 当使用测试配置文件执行测试时 imp

随机推荐

  • unity性能优化方案整理 & 一些思路 & 一些技巧(持续更新 2019-09-12)

    原文链接1 https www cnblogs com zhenlong p 4862869 html 原文链接2 http www xuanyusong com archives 3205 原文链接3 https www cnblogs
  • 网络攻击类型与防火墙防范策略汇总

    1 防火墙攻击防范概述 防火墙的攻击防范功能能够检测出多种类型的网络攻击 并能采取相应的措施保护内部网络免受恶意攻击 保证内部网络主机的正常运行 攻击防范功能可以抵御传统的单包攻击 也能够抵御各种常见的DDoS攻击 单包攻击主要包括扫描类攻
  • SQL server 查询语句

    select from test dbo users 普通条件查询 where id 1 模糊查询 select from test dbo users where username like li 范围查询 select from tes
  • org.springframework.stereotype 注解

    org springframework stereotype 1 controller 控制器 注入服务 2 service 服务 注入dao 3 repository dao 实现dao访问 4 component 把普通pojo实例化到
  • 华为OD机试 - 贪吃蛇(Java )

    题目描述 贪吃蛇是一个经典游戏 蛇的身体由若干方格连接而成 身体随蛇头移动 蛇头触碰到食物时 蛇的长度会增加一格 蛇头和身体的任一方格或者游戏版图边界碰撞时 游戏结束 下面让我们来完成贪吃蛇游戏的模拟 给定一个N M的数组arr 代表N M
  • 排序算法总结—时间复杂度O(n^2)—冒泡/插入/选择小记

    排序算法总结 时间复杂度O n 2 冒泡 插入 选择小记 冒泡排序 最基础的排序 一层一层将最大值或最小值放到该去的位置 适用于顺序存储和链表存储 时间复杂度 O n 2 空间复杂度 O 1 稳定的排序算法 产生的有序子序列全局有序 每次有
  • python2 命令行模式CMD改变颜色失败解决办法

    参考链接 https blog csdn net qq 15158911 article details 88943571 这个问题找了一个下午的解决办法 写好了python代码之后 cmd使用命令行模式运行 颜色演示的时候效果是这样的 解
  • 使用Mybatis从数据库中查出时间显示时分后发现不符合

    问题介绍 这个问题困扰我了整整一天 我用Google搜了一页又一页都没有找到解决方案 大部分都是使用SimpleDateFormat 设置时区后再格式化 但是不论我怎么选择时区 问题并没有解决 在一步步排查后 我选择在google上搜索my
  • python txt追加写入_python 实现在txt指定行追加文本的方法

    python 实现在txt指定行追加文本的方法 如下所示 fp file data txt lines for line in fp lines append line fp close lines insert 1 a new line
  • 【机器人学】【国家标准】发现《GB/T 29824-2013 工业机器人 用户编程指令》的一个编辑错误

    错误处 近来的主要工作是设计工业机器人控制系统 需要设计一系列的用户编程指令 在查阅国家标准的时候 发现一处错误 封面
  • 探索 Mimikatz 神器之 WDigest

    自从 Mimikatz 出现以来 我们很多人已经对这个工具进行过封装 也尝试过注入 或者是使用 powershell 实现类似的功能 现在我们决定给这个工具添加一个内存 dump 的功能 无论我们如何封装使用 Mimikatz 它仍然是 W
  • Mysql-通过创建存储过程完成“对多个同类表进行查询并将结果汇总储存在新表中”

    案例背景 公司数据储存在N张表中 N是大数 现在需要求每个类别某类数据topN用户的数据 代码结果 创建存储过程将数据从多个相同表中查询求topN并存入 本文主要内容 知识点 分组查询topN问题 https editor csdn net
  • 雅可比矩阵机器学习_深度学习中的Matrix Calculus (一)

    绝大多数网络上对深度学习公式的推导教程notation混乱 而专门介绍Matrix Calculus的材料可能又过于繁杂 其实在深度学习中用到的矩阵微积分并不艰深 看完之后你就可以愉快的进行各种推导了 本文仅作为优秀资源的搬运总结 有余力的
  • SQL 备份表-造数据-还原表

    不影响日后工作的造数据步骤 1 备份表内的内容 2 清表内内容 3 给表造数据 4 还原表 1 备份表内的内容 create table lt 库名2 gt lt 表名2 gt as select from lt 库名1 gt lt 表名1
  • 搭建iscsi存储系统

    内容 常见硬盘介绍 NAS和SAN服务器概述 实战 配置IP SAN服务器 实战 IP SAN服务器日常操作 存储设备 阵列柜 SAS 容量小 300G 600G 900G 价格贵 SATA 容量大 500G 750G 1T 2T 3T 4
  • HackMyVM Influencer

    HackMyVM Influencer 靶机IP 192 168 173 148 信息收集 nmap端口扫描 开启80 2121端口 ftp连接2121端口 匿名用户登录 下载所有文件 查看note txt 依次对图片文件 进行密码爆破 在
  • for和do-while循环以及break和continue语句

    目录 for循环 语法形式 循环的执行流程图 for循环和while循环的区别 例子 do while循环 语法形式 循环的执行流程图 例子 break和continue语句 break和continue在不同循环中的区别 while fo
  • 20张程序员才懂的搞笑图!保准你笑出猪叫......

    温馨提示 请勿在以下场景食用本文 吃饭时 挤电梯时 路过精神病院时 HTML的4种黑法 扫地阿姨 HTML确实是一门编程语言啊 扫地阿姨 所以HTML程序员不能称自己是程序员 扫地阿姨 这个黑的太过分了吧 扫地阿姨 小姑娘我被你的外表欺骗的
  • Java基础之字符常量

    表示一个字符 一个字符常量要用一对英文半角格式的单引号 引起来 它可以是英文字母 数字 标点符号 以及由转义序列来表示的特殊字符 a 1 r u0000 u0000 表示一个空白字符 即在单引号之间没有任何字符 之所以能这样表示是因为 Ja
  • 线程安全集合类概述

    HashTable和Vector 遗留的线程安全实现 效率较低 HashTable map的实现 Vector list的实现 Collections中的带synchronized修饰实现类 如synchronizedMap synchro