JUC集合、map线程安全

news2025/2/26 22:38:40

文章目录

  • 在并发场景下,集合产生的问题
  • 解决方案
    • Vector
    • synchronizedList
    • CopyOnWriteArrayList写时赋值技术
      • 什么是写实复制技术:
  • HashSet线程不安全
    • 问题
    • 解决办法
  • HashMap线程不安全
  • 总结
  • 特点

在并发场景下,集合产生的问题

现在下面这段代码:再一个集合中使用多线程进行同时读和写操作。

public class ThreadDemo4 {

    public static void main(String[] args) {
        //创建ArrayList集合
        List<String> list=new ArrayList<>();

        for (int i = 0; i < 30; i++) {
            new Thread(()->{
                //向集合中添加内容
                list.add(UUID.randomUUID().toString().substring(0,8));
                //从集合中获取内容
                System.out.println(list);
            },String.valueOf(i)).start();
        }
    }
}

在这里插入图片描述
发现该程序运行起来之后,会报出错误,原因是同时对一个集合进行读写操作,那么可能出现的一种情况就是当还没有给集合里面添加内容的时候,线程就已经去读取了,这时候他是读不到的,所以就会出现异常。add()方法是没有使用锁syn关键字所以线程是不安全的

解决方案

Vector

把List list=new ArrayList<>();替换为List list=new Vector<>();
可以去看Vector源码:
该类中的add方法是使用了synchronized关键字,所以线程是安全的
在这里插入图片描述

注:该方案使用的情况不多,它的版本是在jdk1.0

        List<String> list=new Vector<>();
        for (int i = 0; i < 130; i++) {
            new Thread(()->{
                //向集合中添加内容
                list.add(UUID.randomUUID().toString().substring(0,8));
                //从集合中获取内容
                System.out.println(list);
            },String.valueOf(i)).start();
        }

synchronizedList

使用List list= Collections.synchronizedList(new ArrayList<>());

        //创建ArrayList集合

            List<String> list= Collections.synchronizedList(new ArrayList<>());
        for (int i = 0; i < 130; i++) {
            new Thread(()->{
                //向集合中添加内容
                list.add(UUID.randomUUID().toString().substring(0,8));
                //从集合中获取内容
                System.out.println(list);
            },String.valueOf(i)).start();
        }

CopyOnWriteArrayList写时赋值技术

List list=new CopyOnWriteArrayList<>();

        //创建ArrayList集合
        List<String> list=new CopyOnWriteArrayList<>();
        for (int i = 0; i < 130; i++) {
            new Thread(()->{
                //向集合中添加内容
                list.add(UUID.randomUUID().toString().substring(0,8));
                //从集合中获取内容
                System.out.println(list);
            },String.valueOf(i)).start();
        }

在这里插入图片描述

什么是写实复制技术:

例如上图:
有一个集合(方框),有多个线程同时读取其中的数据,也就是并发读。当往集合中写入数据的时候,会把之前的集合复制一份出来,并在新的集合中进行独立的写。当写完之后会进行合并,再进行读的时候就会读取新的集合。中的数据。根据该过程可以解决集合并发出现的问题。就不会出现并发修改的异常

HashSet线程不安全

问题

         Set<String> set=new HashSet<>();
        for (int i = 0; i < 130; i++) {
            new Thread(()->{
                //向集合中添加内容
                set.add(UUID.randomUUID().toString().substring(0,8));
                //从集合中获取内容
                System.out.println(set);
            },String.valueOf(i)).start();
        }

在这里插入图片描述

解决办法

Set set=new CopyOnWriteArraySet<>();
使用Set set=new CopyOnWriteArraySet<>();进行定义

HashMap线程不安全

普通定义HashMap

        Map<String,String> map=new HashMap<>();
        for (int i = 0; i < 130; i++) {
            String key=String.valueOf(i);
            new Thread(()->{
                //向集合中添加内容
                map.put(key,UUID.randomUUID().toString().substring(0,8));
                //从集合中获取内容
                System.out.println(map);
            },String.valueOf(i)).start();
        }

同样会出现刚刚的问题,那么在定义的时候使用ConcurrentHashMap进行定义


        Map<String,String> map=new ConcurrentHashMap<>();
        for (int i = 0; i < 130; i++) {
            String key=String.valueOf(i);
            new Thread(()->{
                //向集合中添加内容
                map.put(key,UUID.randomUUID().toString().substring(0,8));
                //从集合中获取内容
                System.out.println(map);
            },String.valueOf(i)).start();
        }

总结

在并发编程中,Java提供了一些线程安全的集合类,如JUC集合和ConcurrentHashMap。这些集合类在多线程环境下能够保证数据的一致性和线程安全性。以下是对JUC集合和ConcurrentHashMap的总结:

JUC集合:JUC(Java.util.concurrent)集合是Java并发包中提供的线程安全的集合类。它们是对传统集合类的并发安全版本的改进。JUC集合包括了ConcurrentHashMap、ConcurrentLinkedQueue、ConcurrentSkipListSet等。它们采用了一些高效的并发算法和锁机制,能够在多线程环境下保证数据的一致性和线程安全性。

ConcurrentHashMap:ConcurrentHashMap是JUC集合中最常用的线程安全的Map实现。它通过将整个Map分成多个Segment(段)来实现并发访问的能力。每个Segment都相当于一个小的HashMap,只锁定当前访问的Segment,而不是整个Map,从而提高了并发性能。ConcurrentHashMap在读取操作上几乎没有任何锁开销,只有在写入操作时才需要进行同步。

线程安全性:JUC集合和ConcurrentHashMap的线程安全性是通过使用并发控制机制来实现的,如锁机制、CAS(Compare and Swap)操作、分段锁等。这些机制能够确保在多线程环境下,对集合的并发访问不会导致数据的不一致性或线程冲突。

性能优化:JUC集合和ConcurrentHashMap在设计上注重了性能的优化。它们采用了一些高效的并发算法和数据结构,如分段锁、无锁算法等,以提高并发访问的效率。同时,它们还提供了一些高级功能,如原子操作、并发迭代器等,以满足多线程环境下的特殊需求。

综上所述,JUC集合和ConcurrentHashMap是Java中用于实现线程安全的集合类。它们通过使用并发控制机制和高效的并发算法,能够在多线程环境下保证数据的一致性和线程安全性,并且具有较高的并发性能和灵活性。在并发编程中,使用这些线程安全的集合类能够有效地简化并发控制的复杂性,提高程序的稳定性和可靠性。

特点

JUC集合和ConcurrentHashMap是Java中用于实现线程安全的集合类。它们具有以下特点和优势:

线程安全性:JUC集合和ConcurrentHashMap通过使用并发控制机制和锁机制,能够保证在多线程环境下对集合的并发访问不会导致数据的不一致性或线程冲突。

高效性能:JUC集合和ConcurrentHashMap在设计上注重了性能的优化。它们采用了一些高效的并发算法和数据结构,如分段锁、无锁算法等,以提高并发访问的效率。同时,它们还提供了一些高级功能,如原子操作、并发迭代器等,以满足多线程环境下的特殊需求。

并发性能优化:ConcurrentHashMap通过将整个Map分成多个Segment(段),只锁定当前访问的Segment,而不是整个Map,从而提高了并发性能。这种分段锁的设计使得读操作几乎没有任何锁开销,只有在写入操作时才需要进行同步。

灵活性和可扩展性:JUC集合和ConcurrentHashMap提供了一些高级功能,如原子操作、并发迭代器等,以满足多线程环境下的特殊需求。同时,它们还支持动态扩容和自动调整容量,能够根据实际需求进行灵活的扩展和调整。

并发编程简化:使用JUC集合和ConcurrentHashMap能够有效地简化并发控制的复杂性。它们提供了一些高级的并发控制机制,如原子操作、并发迭代器等,能够简化并发编程的代码逻辑,提高程序的稳定性和可靠性。

综上所述,JUC集合和ConcurrentHashMap是Java中用于实现线程安全的集合类,它们具有线程安全性、高效性能、并发性能优化、灵活性和可扩展性等优势。在并发编程中,使用这些线程安全的集合类能够有效地简化并发控制的复杂性,提高程序的稳定性和可靠性。

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

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

相关文章

视频分割合并工具说明

使用说明书&#xff1a;视频分割合并工具 欢迎使用视频生成工具&#xff01;本工具旨在帮助您将视频文件按照指定的规则分割并合并&#xff0c;以生成您所需的视频。 本程序还自带提高分辨率1920:1080&#xff0c;以及增加10db声音的功能 软件下载地址 https://github.com/c…

kafka--技术文档--spring-boot集成基础简单使用

阿丹&#xff1a; 查阅了很多资料了解到&#xff0c;使用了spring-boot中整合的kafka的使用是被封装好的。也就是说这些使用其实和在linux中的使用kafka代码的使用其实没有太大关系。但是逻辑是一样的。这点要注意&#xff01; 使用spring-boot整合kafka 1、导入依赖 核心配…

【DEVOPS】Jenkins使用问题 - 控制台输出乱码

0. 目录 1. 问题描述2. 解决方案3. 最终效果4. 总结 1. 问题描述 部门内部对于Jenkins的使用采取的是Master Slave Work Node的方式&#xff0c;即作为Master节点的Jenkins只负责任务调度&#xff0c;具体的操作由对应的Slave Work Node去执行。 最近团队成员反馈一个问题&a…

高忆管理股票分析:1年期LPR下调10个基点 融资成本稳中有降

8月21日&#xff0c;中国人民银行授权全国银行间同业拆借中心发布&#xff0c;最新借款商场报价利率(LPR)为&#xff1a;1年期种类报3.45%&#xff0c;较上一期下降10个基点&#xff1b;5年期以上种类报4.20%&#xff0c;与前一期相等。 上海高忆私募基金&#xff08;百度搜索高…

2023深圳智博会,正运动助力智能装备“更快更准”更智能!

■展会名称&#xff1a; 2023 深圳国际智能装备产业博览会暨深圳国际电子装备产业博览会&#xff08;以下简称“EeIE 智博会”&#xff09; ■展会日期 2023年8月29日-31日 ■展馆地点 深圳国际会展中心(宝安新馆) ■展位号 3B030 正运动技术&#xff0c;作为国内领先的…

C++动态规划DP Dynamic Programming实现B3635 硬币问题B3636 文字工作

DP动态规划的基本手段及如何解决问题 1. 那带一个问题&#xff0c;只要解决几个对应的小一点规模的问题就能得到问题本身的解 2. 设计一张表格&#xff0c;每一个格子都是一个问题的解 3. 一步步完成这张表格&#xff0c;根据一个数据&#xff0c;往表格前面的数据查找 4. …

APT80DQ40BG-ASEMI低功耗半导体APT80DQ40BG

编辑&#xff1a;ll APT80DQ40BG-ASEMI低功耗半导体APT80DQ40BG 型号&#xff1a;APT80DQ40BG 品牌&#xff1a;ASEMI 封装&#xff1a;TO-3P 恢复时间&#xff1a;&#xff1e;50ns 正向电流&#xff1a;80A 反向耐压&#xff1a;400V 芯片个数&#xff1a;2 引脚数量…

java八股文面试[JVM]——类加载器

一、类加载器的概念 类加载器是Java虚拟机用于加载类文件的一种机制。在Java中&#xff0c;每个类都由类加载器加载&#xff0c;并在运行时被创建为一个Class对象。类加载器负责从文件系统、网络或其他来源中加载类的字节码&#xff0c;并将其转换为可执行的Java对象。类加载器…

Kaniko在containerd中无特权快速构建并推送容器镜像

目录 一、kaniko是什么 二、kaniko工作原理 三、kanijo工作在Containerd上 基于serverless的考虑&#xff0c;我们选择了kaniko作为镜像打包工具&#xff0c;它是google提供了一种不需要特权就可以构建的docker镜像构建工具。 一、kaniko是什么 kaniko 是一种在容器或 Kube…

机器学习基础11-算法比较(基于印第安糖尿病Pima Indians 数据集)

比较不同算法的准确度&#xff0c;选择合适的算法&#xff0c;在处理机器学习的问题时是非常重要的。本节将介绍一种模式&#xff0c;在scikit-learn中可以利用它比较不同的算法&#xff0c;并选择合适的算法。你可以将这种模式作为自己的模板&#xff0c;来处理机器学习的问题…

如何备份系统?很简单,2个方法教会你!

在计算机使用过程中&#xff0c;系统故障、病毒攻击、意外损坏等问题可能导致数据丢失和系统无法正常运行。为了保障数据安全和系统稳定&#xff0c;如何备份系统是至关重要的。本文将介绍备份系统的2个方法&#xff0c;帮助用户轻松备份系统&#xff0c;确保数据的安全和系统的…

什么是网络中的服务质量 (QoS),其相关技术和关键指标有哪些?

QoS&#xff08;Quality of Service&#xff0c;服务质量&#xff09;指一个网络能够利用各种基础技术&#xff0c;为指定的网络通信提供更好的服务能力&#xff0c;是网络的一种安全机制&#xff0c;是用来解决网络延迟和阻塞等问题的一种技术。QoS的保证对于容量有限的网络来…

MES管理系统解决方案,助力汽配企业打造透明化管理

随着汽车行业的不断发展&#xff0c;汽配行业面临着越来越严格的质量要求和生产效率提升挑战。为了满足这些需求&#xff0c;汽配企业需要实现生产过程的透明化和精细化。MES管理系统解决方案作为生产过程的核心管理系统&#xff0c;可以为汽配企业提供全面的解决方案&#xff…

ubuntu22.04安装搜狗输入法后始终无法输入中文

这次真的整我很久很久&#xff0c;我都不想用搜狗输入法了&#xff0c;结果无意间还是被我解决了。 ubuntu22.04安装搜狗输入法的步骤参考官网给的文档就行&#xff0c;这里我只说我的为啥输入不了中文 点击Fcitx配置 把搜狗输入法个人版放在第一位就行(我的系统语言是中文&am…

思维导图的作用有哪些?了解一下这几个作用

思维导图的作用有哪些&#xff1f;思维导图是一种以图形和颜色为主要表现形式的思维工具&#xff0c;它可以帮助人们更好地组织和表达思想。它的作用有很多&#xff0c;下面就给大家简单介绍一下。 1、帮助记忆 思维导图可以将大量信息整合到一个图形中&#xff0c;这有助于人…

一次由摔碎手机屏幕导致的急速搬家

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 卷圈 运营 / SandLiu 卷圈 监制 / 姝琦 封面 / 姝琦midjourney 产品统筹 / bobo 想问问大家&#xff0c;都在什么情况下搬过家&#xff1f; 有的时候搬家是迫不得已&#xff0c;房东突然发难&#xff1b; 有的时候搬…

MyBatis分页插件PageHelper的使用及MyBatis的特殊符号---详细介绍

一&#xff0c;分页的概念 分页是一种将大量数据或内容分割成多个页面以便逐页显示的方式。在分页中&#xff0c;数据被分割成一定数量的页&#xff0c;每页显示一部分数据或内容&#xff0c;用户可以通过翻页或跳分页是一种将大量数据或内容分割成多个页面以便逐页显示的方式。…

深入浅出 RPC框架

RPC 框架分层设计 01 基本概念 1.1 本地函数调用 以上步骤只是为了说明原理。事实上编译器经常会做优化&#xff0c;对于参数和返回值少的情况会直接将其存放在寄存器&#xff0c;而不需要压栈弹栈的过程&#xff0c;甚至都不需要调用call&#xff0c;而直接做inline操作 1.2 远…

Forrester首次面向中国的开源报告:阿里云在云原生领域开源布局最全面

Forrester 于近期发布了《Navigate The Cloud-Native Ecosystem In China, 2023》&#xff0c;报告概述了中国云原生领域的开源项目对构建云原生生态的促进作用&#xff0c;这些开源项目正深刻影响着企业的技术决策者以何种策略拥抱云原生这一现代 IT 基础设施的核心。 报告表…

SMC状态机 讲解2 从模型到SMC

SMC状态机 讲解2 从模型到SMC 1、实例化有限状态机&#xff08;FSM)2、简单转换 Simple Transition3、外部环回转换 External Loopback Transition4、内部环回转换 Internal Loopback Transition5、转换动作6、转换Guard7、转换参数8、Entry 和 Exit动作9、Push 转换10、Pop转换…