【并发编程篇】解决线程安全问题 — CopyOnWriteArraySet

文章目录

  • 🍔情景引入
  • 🌺报错了,解决方法
    • ⭐方法一
    • ⭐方法二

在这里插入图片描述

🍔情景引入

我们看下面这段代码
在这里插入图片描述
运行后报错了

我们看看报错原因
在这里插入图片描述报错原因是并发修改异常

🌺报错了,解决方法

⭐方法一

我们使用其他工具类,使用Collections,把HashSet转为synchronizedSet()

我们使用 Collections.synchronizedSet() 方法将普通的 HashSet 转换为一个线程安全的 Set 集合。通过对 set 进行同步化操作,可以保证在多线程环境下对 set 的访问是线程安全的。
Collections.synchronizedSet() 方法返回一个线程安全的 Set 对象,该对象内部使用同步机制来确保多线程环境下的安全访问。具体来说,它会对 Set 的各种操作(如添加、删除、迭代等)进行同步化处理,以避免并发修改引发的线程安全问题,比如数据不一致或异常。

好处如下:

  • 线程安全:通过使用 Collections.synchronizedSet() 方法,可以确保多个线程同时访问 set 时不会出现数据竞争和不一致的问题。这样可以提高程序的健壮性和可靠性
  • 方便转换:通过使用 Collections.synchronizedSet() 方法,可以方便地将普通的集合类转换为线程安全的集合类,无需手动编写同步代码。

需要注意的是,虽然 Collections.synchronizedSet() 方法可以确保对集合的基本操作是线程安全的,但在进行复合操作时仍然需要额外的同步措施。例如,在循环遍历 set 并进行复合操作时,仍需要使用外部的同步机制,比如使用 synchronized 关键字或 Lock 接口。

此外,如果只是在单线程环境下使用集合,或者可以保证对集合的访问是单线程的,那么不一定需要使用线程安全的集合类。因为线程安全的集合类在性能上会有一些额外开销,所以在单线程环境下使用普通的集合类可能更加高效。

package org.Test6;import java.util.*;public class ListTest {public static void main(String[] args) {Set<String>set = Collections.synchronizedSet(new HashSet<>());for (int i=0;i<10;i++){new Thread(()->{set.add(UUID.randomUUID().toString().substring(0,5));System.out.println(set);},String.valueOf(i)).start();}}
}

在这里插入图片描述

⭐方法二

使用juc包下的CopyOnWriteArraySet方法
使用 CopyOnWriteArraySet 来创建一个线程安全的集合。CopyOnWriteArraySet 是 Java 并发包中提供的一种并发集合类,它具有以下好处:

  • 线程安全:CopyOnWriteArraySet 是线程安全的集合类,可以在多线程环境中安全地进行读取和写入操作,而无需额外的同步措施。
  • 写入时复制:CopyOnWriteArraySet 内部使用写入时复制的机制来保证线程安全。当对集合进行修改(添加、删除元素)时,它会先将集合进行复制,然后在新副本上进行修改操作,最后再用新副本替换旧副本。这样可以确保在进行修改操作时不会影响到正在进行迭代的线程,从而避免了传统集合类在迭代过程中需要额外的同步操作。

总之,CopyOnWriteArraySet 提供了一种简单而高效的线程安全集合解决方案,适用于特定的读多写少的并发场景。

package org.Test6;import java.util.*;
import java.util.concurrent.CopyOnWriteArraySet;public class ListTest {public static void main(String[] args) {Set<String>set = new CopyOnWriteArraySet<>();for (int i=0;i<10;i++){new Thread(()->{set.add(UUID.randomUUID().toString().substring(0,5));System.out.println(set);},String.valueOf(i)).start();}}
}

在这里插入图片描述

在技术的道路上,我们不断探索、不断前行,不断面对挑战、不断突破自我。科技的发展改变着世界,而我们作为技术人员,也在这个过程中书写着自己的篇章。让我们携手并进,共同努力,开创美好的未来!愿我们在科技的征途上不断奋进,创造出更加美好、更加智能的明天!

在这里插入图片描述

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

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

相关文章

【领域驱动设计】模式--通用语言(Ubiquitous language)

一.前言 有道无术术可求&#xff0c;有术无道止于术。方法论的形成都是为了让我们能够更高效&#xff0c;系统的解决问题&#xff0c;而不至于遇到问题不知所措。 二.通用语言的必要性 相信大家在实际的软件开发流程过程中&#xff0c;经常会遇到参照 Prd原型 编码出的系统与实…

骑砍战团MOD开发(27)-module_tableau_materials.py材质

一.配置材质资源 OpenBrf寻找对应材质资源. tableau配置材质资源 ("round_shield_1", 0, "sample_shield_round_1", 512, 256, 0, 0, 0, 0,[(store_script_param, ":banner_mesh", 1),(set_fixed_point_multiplier, 100),(init_position, pos1),…

NFC物联网智能购物车设计方案

智能购物车是综合利用计算机网络、射频识别技术、数据库技术、单片机于一体的设备具有先进性、便于管理性、经济性、普适性。基于NFC (Near Field Communication&#xff0c;近场通信)技术的智能购物车&#xff0c;能够大幅缩短结账排队时间&#xff0c;实现“无感支付”。NFC是…

【黑产攻防道04】利用pow工作量证明降低黑产的破解效率

上一期我们提到&#xff0c;黑产有三种常见的破解方式&#xff1a; 1.通过识别出验证码图片答案实现批量破解验证&#xff0c;即图片答案识别&#xff1b; 2.在了解通讯流程之后直接携带相关参数发请求&#xff0c;即协议破解&#xff1b; 3.使用各种客户端模拟器来模拟真人…

高校实验室安全管理视频监控系统设计:AI视频识别技术智能分析网关V4的应用

一、背景 实验室作为科研与教学的核心场所&#xff0c;其重要性不言而喻。高校实验室由于其开放性与多样性&#xff0c;安全管理尤为重要。高校实验室的安全管理&#xff0c;不仅是保障科研与教学质量的基础&#xff0c;更是校园安全的重要组成部分。一旦发生安全事故&#xf…

FPGA 底层资源介绍

Xilinx FPGA底层资源介绍 本文转载自&#xff1a;瓜大三哥微信公众号 XILINX FPGA 芯片整体架构如下所示&#xff0c;整个芯片是以BANK进行划分的&#xff0c;不同的工艺、器件速度和对应的时钟具有不同的BANK数量&#xff08;下面截图是以K7325tffg676为例&#xff09;&…

外汇天眼:仿冒OANDA安达──诓称分析师带领稳赚不赔,恶意爆仓再三骗入金

最近有考虑做美股、期货、外汇的投资人请注意&#xff0c;近期外汇天眼收到一位台湾投资人爆料&#xff0c;分享自己误用仿冒OANDA安达的假券商而损失新台币50万元&#xff0c;以下让我们一起了解这个诈骗案件的详细经过与手法。 今年7月底&#xff0c;受害者在社交平台IG上被…

解决Github无法上传>100M文件——只需两行代码

文章目录 合作推广&#xff0c;分享一个人工智能学习网站。计划系统性学习的同学可以了解下&#xff0c;点击助力博主脱贫( •̀ ω •́ )✧ 废话不多说&#xff0c;如果在githubpush文件太大时&#xff0c;会报错&#xff1a;this exceeds GitHub’s file size limit of 100.…

SLAM PnP问题以及相关基础知识

目标泛函 目标泛函是在优化问题中使用的一种数学工具&#xff0c;目标泛函是一个函数&#xff0c;它将一个或多个函数映射到一个实数。它常用于描述需要最小化或最大化的函数。在优化问题中&#xff0c;我们通常希望找到使得某个特定函数取得最大值或最小值的变量值。目标泛函…

喜讯|极狐GitLab 通过信通院汽车软件研发效能成熟度模型能力

12 月 27 日&#xff0c;在由中国信息通信研究院&#xff08;下称信通院&#xff09;、中国通信标准化协会联合主办的2023系统稳定性与精益软件工程大会-汽车云质效专场峰会上&#xff0c;信通院发布了“2023年下半年汽车云评估结果”&#xff0c;极狐GitLab 一体化 DevOps 平台…

c 语言, 随机数,一个不像随机数的随机数

c 语言&#xff0c; 随机数&#xff0c;一个不像随机数的随机数 使用两种方式获取随机数&#xff0c;总感觉使用比例的那个不太像随机数。 方法一&#xff1a; rand() 获取一个随机数&#xff0c;计算这个随机数跟最大可能值 RAND_MAX&#xff08;定义在 stdlib.h 中&#xf…

C++初阶(十七)模板进阶

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、非类型模板参数二、模板的特化1、概念2、函数模板特化3、类模板特化1、全特化2、偏特化 三…

k8s的陈述式资源管理(命令行操作)

&#xff08;一&#xff09;k8s的陈述式资源管理 1、命令行&#xff1a;kubectl命令行工具——用于一般的资源管理 &#xff08;1&#xff09;优点&#xff1a;90%以上ce场景都可以满足 &#xff08;2&#xff09;特点&#xff1a;对资源的增、删、查比较方便&#xff0c;对…

7+衰老+WGCNA+机器学习+实验,非肿瘤领域的衰老相关研究

今天给同学们分享一篇生信文章“Identification of aging-related biomarkers and immune infiltration characteristics in osteoarthritis based on bioinformatics analysis and machine learning”&#xff0c;这篇文章发表在Front Immunol期刊上&#xff0c;影响因子为7.3…

C语言——小细节和小知识7

一、逆序字符串 1、递归1 #include <stdio.h> #include <string.h>void ReverseArray(char *str) {char temp *str;//1int len (int)strlen(str);*str *(str len - 1);//2*(str len - 1) \0;//3if(strlen(str 1) > 2)//只要字符串还大于2&#xff0c;就…

解锁小程序UI设计的奥秘:必须知晓的相关事项

一、什么是小程序 2016年张小龙首次提出小程序概念&#xff0c;全称为“微信小程序”&#xff0c;英文名为“微信小程序”MiniProgram它是一种基于微信生态系统、开发周期短、成本低、无需下载安装、即用即走的应用。 到目前为止&#xff0c;小程序不仅是微信独有的&#xff…

4-链表-合并两个有序链表

这是链表的第4题&#xff0c;来个简单算法玩玩。力扣链接。 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4]示例 2&#xff…

Android Studio 如何实现软件英文变中文教程

目录 前言 一、确认版本号 二、下载汉化包 三、汉化包安装 四、如何实现中英文切换 五、更多资源 前言 Android Studio是一款功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;用于开发Android应用程序。默认情况下&#xff0c;Android Studio的界面和…

移动机器人规划、控制算法初识

规划与控制PNC(PlanningandControl) 1 路径规划算法&#xff1a; 移动机器人路径规划算法总结_机器人运动轨迹算法-CSDN博客 2 控制算法&#xff1a; 机器人控制算法综述_机器人控制技术综述-CSDN博客 机器人控制算法简要概述_智能控制算法-CSDN博客 学习资源&#xff1a; …

绝地求生:大逃杀,鼠标灵敏度设置教程及枪法练习技巧 鼠标灵敏度怎么设置

《绝地求生大逃杀》鼠标灵敏度怎么设置&#xff1f;作为一款FPS游戏&#xff0c;如何调整鼠标参数是大家急需掌握的&#xff0c;今天闲游盒带来“院长尼克”分享的《绝地求生大逃杀》鼠标灵敏度设置教程及枪法练习技巧&#xff0c;废话不多说&#xff0c;下面我们一起来看吧。 …