安全线程的集合

news2025/5/22 23:22:14

1. CopyOnWriteArrayList

package com.kuang.unsafe;

import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;

//java.util.ConcurrentModificationException  并发修改异常! 因为List集合线程不安全!
public class ListTest {
    public static void main(String[] args) {
        //并发下 ArrayList 不安全的!
        /**
         * 解决方案:
         * 1. List<String> list = new Vector<>();  只是在add()方法加了一个synchronized 关键字 ,最早出现的,但不是最优解,效率太低了.
         * 2. Collections工具类转化为安全集合        List<String> list = Collections.synchronizedList(new ArrayList<>());
         * 3.第三种方案:JUC下的安全集合 new CopyOnWriteArrayList<>(); import java.util.concurrent.CopyOnWriteArrayList;
         *
         */
        //CopyOnWrite 写入时复制  COW 计算机程序设计领域的一种优化策略;
        //多个线程调用的时候,list,读取的时候,固定的,写入(覆盖);
        //在写入的时候避免覆盖,造成的数据问题
//         写入复制一个数组写入,写完在插进去
        //读写分离 MyCat

        //CopyOnWriteArrayList 比 Vector  牛在哪里?
        //没有用Synchronized 用的是 Lock锁  效率提高,

       List<String> list =new CopyOnWriteArrayList<>();

        for (int i = 0; i < 10; i++) {
            new Thread(()->{
                list.add(UUID.randomUUID().toString().substring(0,5));
                System.out.println(list);
            },String.valueOf(i)).start();
        }


    }
}

方法推荐1.先会用2.货比三家,寻找其他解决方案 3.看源码 

CopyOnWriteArrayList 是 Java 中的一个线程安全的集合类,它的设计目的是在读操作非常频繁,而写操作相对较少的情况下提供高效的并发访问。

CopyOnWriteArrayList 使用写入时复制(Copy-On-Write)的机制来实现线程安全。当有写操作(例如添加、修改或删除元素)时,它会创建一个新的副本(即复制原有的数组),并在副本上执行写操作,而不是直接在原有数组上进行操作。这样可以保证读操作不会被阻塞,因为读操作始终在原有的数组上进行。

使用写入时复制的主要优点是避免了读写冲突,从而提供了较好的并发性能。在多线程环境下,多个线程可以同时读取 CopyOnWriteArrayList 的内容,而不需要进行额外的同步操作。这对于读操作非常频繁的场景非常有效。

然而,写操作会导致创建新的副本,因此会消耗额外的内存,并且对于频繁的写操作可能会影响性能。因此,CopyOnWriteArrayList 适用于读多写少的场景,例如读取频率远远高于写入频率的缓存或事件监听器列表。

总结来说,CopyOnWriteArrayList 使用写入时复制的机制,通过牺牲写操作的性能来提供读操作的高并发性能,适用于读多写少的场景。

2. CopyOnWriteArraySet

package com.kuang.unsafe;

import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.CopyOnWriteArraySet;
//java.util.ConcurrentModificationException 并发下出现这个问题  :并发修改异常

public class SetTest {
    public static void main(String[] args) {

        /**
         * 注意synchronizedSet在用迭代器循环时,另外一个线程试图修改数据,也会发生并发修改异常!!
         * HashSet<String> set = new HashSet<>();
         * 解决方案:
         * 1.    Set<String> set = Collections.synchronizedSet(new HashSet<String>());
         * 2.    Set<String> set = new CopyOnWriteArraySet<>();
         *
         */
       Set<String> set = new CopyOnWriteArraySet<>();

        for (int i = 0; i < 30; i++) {
            new Thread(()->{
                set.add(UUID.randomUUID().toString().substring(0,5));
                System.out.println(set);
            }).start();
        }



    }
}

2.1 HashSet 底层是什么?

 public HashSet() {
        map = new HashMap<>();
    }

//add  set 本质就是 map  key  是无法重复的

  public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }
private static final Object PRESENT = new Object();

它是一个常量,是不变的值

3.ConcurrentHashMap

package com.kuang.unsafe;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;

//java.util.ConcurrentModificationException
public class MapTest {
    public static void main(String[] args) {
        //map 是这样用的吗? 不是,工作里不用HashMap
        //默认等价于什么? new HashMap<>(16,0.75);
        /**
         * 解决方案:  Map<String, String> map = new HashMap<>();
         * 1.    Map<String, String> map = Collections.synchronizedMap(new HashMap<>());
         * 2.    Set<String> set = new CopyOnWriteArraySet<>();
         * 3.    Map<String, String> map = new ConcurrentHashMap<>();
         */

       Map<String, String> map = new ConcurrentHashMap<>();

        for (int i = 0; i < 30; i++) {
            new Thread(()->{
                map.put(Thread.currentThread().getName(), UUID.randomUUID().toString().substring(0,5));
                System.out.println(map);
            },String.valueOf(i)).start();
        }
    }
}

                

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

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

相关文章

Linux —— 线程

一&#xff0c;线程概念 在一程序内&#xff0c;一个执行路线称为线程thread&#xff0c;即线程是一个进程内部的控制序列&#xff1b; 一切进程至少都有一个执行线程&#xff1b;线程在进程内部运行&#xff0c;本质是在进程地址空间内运行&#xff1b;在Linux系统中&#xf…

许可分析 license分析 第十七章

许可分析是指对软件许可证进行详细的分析和评估&#xff0c;以了解组织内部对软件许可的需求和使用情况。通过许可分析&#xff0c;可以帮助组织更好地管理和优化软件许可证的使用。以下是一些可能的许可分析方法和步骤&#xff1a; 软件许可证的云化管理&#xff1a;将许可证管…

如何删除清理Mac“其他”文件并删除它

当我们通过「关于本机」>「存储空间」查看硬盘的空间占用情况时。系统会将存储空间根据不同文件类别所占的空间大小显示在条状图上&#xff0c;大部分类型看文字都比较好理解&#xff0c;但对于“其他”这一类很多小伙伴都感觉很困惑&#xff0c;会产生一些问题如&#xff1…

Mac FoneLab for Mac:轻松恢复iOS数据,专业工具助力生活

如果你曾经不小心删除了重要的iOS数据&#xff0c;或者因为各种原因丢失了这些数据&#xff0c;那么你一定知道这种痛苦。现在&#xff0c;有一个名为Mac FoneLab的Mac应用程序&#xff0c;它专门设计用于恢复iOS数据&#xff0c;这可能是你的救星。 Mac FoneLab for Mac是一种…

MySQL数据库详解 二:数据库的高级语言和操作

文章目录 1. 克隆表 ---- 将数据表的数据记录生成到新的表中1.1 方式一&#xff1a;先创建新表&#xff0c;再导入数据1.2方式二&#xff1a;创建的时候同时导入 2. 清空表 ---- 删除表内的所有数据2.1 delete删除2.2 truncate删除&#xff08;重新记录&#xff09;2.3 创建临时…

基于Java+SpringBoot+Vue的大学生线上心理咨询系统(可随意更改项目主题如医院预约、店铺预约、专家挂号、在线咨询等)

大学生线上心理咨询室系统 一、前言二、我的优势2.1 自己的网站2.2 自己的小程序&#xff08;小蔡coding&#xff09;2.3 有保障的售后2.4 福利 三、开发环境与技术3.1 MySQL数据库3.2 Vue前端技术3.3 Spring Boot框架3.4 微信小程序 四、功能设计4.1 主要功能描述 五、系统实现…

确认过眼神,你就是我心中的【理想型】API!

API作为开发者友好的Friend凭借信息直达、灵活便捷、简单高效的特点&#xff0c;成为了商户绝佳的“资源连接利器”&#xff0c;也是跨境支付过程的“基石堡垒”&#xff0c;通过以上全面的释义&#xff0c;你清晰了解API的作用了吗&#xff1f; 但API与全球电子商户的相遇过程…

《ADS2011射频电路设计与仿真实例》第一章—第六章用ads2017跟做的不同操作

我用的是ads2017&#xff0c;可能是因为版本原因&#xff0c;有些操作和书上的不一样 1.P69 Smith chart utility中&#xff0c;若要调节各曲线圆系的线条颜色&#xff0c;书上写的“执行菜单命令【circles】→【colors】”应该是【view】→【colors】 2.P83 要用微带线&…

Pycharm 2023 年下载、安装教程,好用的插件,附详细图文

文章目录 一、pycharm安装教程二、常用插件推荐安装方法插件介绍1、Material Theme UI Lite2、Chinese (Simplified) Language Pack / 中文语言包3、Statistic4、Json Parser5、Tabnine&#xff08;强烈推荐&#xff09;6、Rainbow Brackets&#xff08;推荐&#xff09;7、Ind…

友善Nona Pi开发板ubuntu22.04系统用Python3.8.17的pip安装PyQt5.15.2时报错“Q_PID”这个宏未定义的一种解决办法

安装命令&#xff1a; pip install PyQt55.15.2 --config-settings --confirm-license --verbose -i https://mirrors.aliyun.com/pypi/simple/ 遇到出错&#xff1a; 如图&#xff1a; 分析具体错误内容&#xff1a; These bindings will be built: Qt, QtCore, QtNetwo…

Draw.io for Mac:强大流程图绘制工具,让你的想法迅速可视化

对于需要经常处理复杂概念和流程的专业人士和爱好者来说&#xff0c;一个优秀的图形设计工具是必不可少的。今天&#xff0c;我们将为您介绍一款流程图绘制神器——Draw.io for Mac。这款应用具备易于使用的界面和强大的功能&#xff0c;可以帮助您快速创建各种精美的流程图。 …

2023CSP游寄

初赛 DAY -2 才刚考开学测就来初赛。 复赛之后就是月测&#xff0c;这就是初三吗。 初中最后一次 CSP&#xff0c;如果 S 没一等就得摆烂了。希望别因为各种原因爆炸。 中午下午借着刷初赛题的名义摆烂&#xff0c;半道题都没写。 CSP2023RP 初赛 DAY -1 看我发现了什么。…

项目实战-day1.0

软件开发整体介绍 软件开发流程 需求分析--需求规格说明书、产品原型 设计--UI设计、数据库设计、接口设计 编码--项目代码、单元测试 测试--测试用例、测试报告 上线运维--软件环境安装、配置 角色分工 软件环境 开发环境&#xff1a;开发人员在开发阶段使用的环境&am…

FactoryTalk View Studio

由于项目需要&#xff0c;学习了FactoryTalk View Studio的一些操作&#xff0c;这里记录一下&#xff0c;方便以后查阅&#xff0c;并且随着项目的学习&#xff0c;随时更新。 FactoryTalk View Studio FactoryTalk View Studio 安装新建一个View Site Edition工程在工程中新建…

Bash脚本自学 - 输入输出重定向

1. 输入输出重定向 首先&#xff0c;我们有一个文件 hello.txt&#xff0c; Hello World! Good day to you 在指令行中输入&#xff1a; wc -w hello.txt输出为&#xff1a; 6 hello.txt wc -w 是用于统计命令行参数中指定文件的字数&#xff08;单词数&#xff09;。 如果…

2023年奢侈品行业研究报告

第一章 行业概况 1.1 定义和分类 奢侈品行业是一个专门生产和销售高价值、高品质、具有独特性和稀缺性商品的行业。这些商品往往超出了人们的基本生活需求&#xff0c;更多地与特定的社会地位、身份认同和审美价值有关。奢侈品不仅仅是物质的&#xff0c;它们往往承载着品牌的…

KubeSphere:登录错误,token failed, reason: getaddrinfo EAI_AGAIN ks-apiserver

1.问题现象: 2.问题解决&#xff1a; [rootk8s-node1 ~]# kubectl get pods --all-namespaces [rootk8s-node1 ~]# kubectl get pods --all-namespaces NAMESPACE NAME READY STATUS …

代码随想录 --- day21 --- 530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数 、236. 二叉树的最近公共祖先

530.二叉搜索树的最小绝对差 题目中要求在二叉搜索树上任意两节点的差的绝对值的最小值。 注意是二叉搜索树&#xff0c;二叉搜索树可是有序的。 遇到在二叉搜索树上求什么最值啊&#xff0c;差值之类的&#xff0c;就把它想成在一个有序数组上求最值&#xff0c;求差值&…

高速DSP系统设计参考指南(一)高速DSP设计面临的挑战

&#xff08;一&#xff09;高速DSP设计面临的挑战 1. 概述2. 一般挑战3. DSP音频系统的挑战4. 视频系统的挑战5. DSP通信系统面临的挑战 资料参考来自TI官网和网络。 1. 概述 DSP芯片&#xff0c;也称数字信号处理器&#xff0c;是一种具有特殊结构的微处理器。DSP芯片的内部…

LabVIEW开发锅炉汽包水位的监督控制和模拟

LabVIEW开发锅炉汽包水位的监督控制和模拟 控制锅炉汽包液位对于机械的安全和设备的保护至关重要。滚筒液位控制器的工作是将滚筒液位提高到指定的设定点&#xff0c;并保持在那里&#xff0c;同时保持一致的蒸汽负荷。锅炉管可能会因该水平急剧下降而暴露&#xff0c;这会导致…