集合类多线程(JUC)

一、集合框架概述

集合: 是广义上的集合,简单理解就是容器。注意:集合只能存放对象类型的数据。
集合框架: 指的是 java.util 包中定义的各种容器类、相关的工具类、接口的统称。不同的容器存储不同结
构的数据。使用时要进行导包操作
百度网盘 获取JDKAPI文档,学习集合基础
链接:https://pan.baidu.com/s/1Z5mL0vVbXX1mMS8UqRaa6Q
提取码:2ktk
集合框架图

二、集合分类

集合一共分为两大类(3小类):

Collection-----即集合 它是像数组一样的单值容器,容器的容量可以动态变化(数组的容量是固定的)。
List-----列表,可以简单理解为有序数组。
Set-----集合,类似于数学中的集合,容器中不允许出现重复元素。
Map-----即映射(或字典) 它是键值对容器,容量可以动态变化。

三、并发集合类

1.List(有序、允许重复元素)

特点:
1.有序性: 列表中的元素按照它们被添加的顺序排列,并且可以根据它们的索引位置来访问。
2.可重复性: 列表允许包含重复的元素,即同一个元素可以出现多次。
3.可变性: 一些列表实现是可变的,意味着可以添加、删除或修改列表中的元素;而另一些列表实现是不可变的,意味着一旦创建就无法更改。

/**
	* 利用ArrayList在多线程下面跑会出现: java.util.ConcurrentModificationException(并发修改异常)
	* 解决方案:
	* 1. List<String> stringList = new Vector<>();Vector线程安全的不会出现并发修改异常,主要是在add方法加了synchronized,会降低速度不推荐;
	* 2. List<String> stringList = Collections.synchronizedList(new ArrayList<>());
	* 3. JUC List<String> stringList = new CopyOnWriteArrayList<>();
*/
//CopyOnWrite 写入时复制,执行操作时创建一个底层数组的副本,并在副本上进行修改,而不是直接在原数组上进行修改
//每次修改操作都需要创建一个新的副本,因此 CopyOnWriteArrayList 的修改操作会比较耗费内存和时间。但是在读取操作(获取元素、遍历等)方面,由于不涉及到修改操作,所以读取操作是无锁的且非常高效的。
List<String> stringList = new CopyOnWriteArrayList<>();
for (int i=0; i<15;i++){
   new Thread(()->{
       stringList.add(UUID.randomUUID().toString().substring(1,6));

       System.out.println(Thread.currentThread().getName() + "---" + stringList);
   },String.valueOf(i)).start();
}

2.Set(无序、不允许重复元素)

特点:
1.无序性: 集合中的元素没有特定的顺序,即它们不会按照特定的顺序排列。
2.不允许重复元素: 集合中不会包含重复的元素,即同一个元素只会出现一次。
3.可变性: 一些集合实现是可变的,允许添加、删除或修改集合中的元素;而另一些集合实现是不可变的,一旦创建就无法更改。
底层采用的是map,所以数据唯一且无序。
在这里插入图片描述

/**
	* Set<String> stringList = new HashSet<>();
	* 同理可证:利用HashSet在多线程下面跑会出现: java.util.ConcurrentModificationException(并发修改异常)
	* 解决方案:
	* 1.Set<String> stringList = Collections.synchronizedSet(new HashSet<>());
	* 2.Set<String> stringList = new CopyOnWriteArraySet<>();
*/
//CopyOnWriteArraySet在添加、修改和删除元素时,并不直接在原始数组上进行操作,而是先将原始数组进行复制,然后在副本上进行修改操作。这样做的好处是,在修改过程中,原始数组不会被其他线程影响到,从而保证了线程安全性。
//由于CopyOnWriteArraySet在修改操作时需要进行数组复制,因此会占用较多的内存。因此,它适用于存储元素数量较少且读取操作频繁的场景,而不适用于存储大量元素或需要频繁进行修改操作的场景。
Set<String> stringList = new CopyOnWriteArraySet<>();
for (int i=0; i<15;i++){
   new Thread(()->{
       stringList.add(UUID.randomUUID().toString().substring(1,6));
       System.out.println(Thread.currentThread().getName() + "---" + stringList);
   },String.valueOf(i)).start();
}

3.Map(键值对(Key-Value)映射关系)

特点:
1.键的唯一性: 在Map中,每个键都是唯一的,不允许重复。
2.键值对的映射关系: 每个键都与一个值相关联,即键值对之间存在一一对应的映射关系。
3.无序性(部分实现): 在某些Map实现中,键值对的存储顺序是不固定的,即Map中的元素不会按照特定的顺序排列。而在另一些实现中,可能会维护一定的顺序,例如按照键的排序顺序
加载因子(Load Factor): 加载因子是指当哈希表中的条目数量达到总容量的多少比例时,触发哈希表的重新哈希(rehashing)操作。在 Java 中,通常情况下,加载因子的默认值为 0.75。这意味着当哈希表中的元素数量达到容量的 75% 时,哈希表会自动扩容并重新哈希,以保持哈希表的性能。
初始化容量(Initial Capacity): 初始化容量是指在创建哈希表时,最初分配的数组大小。在 Java 中,哈希表的默认初始容量为 16。如果你知道将要存储的元素数量的大致范围,可以通过指定初始容量来避免多次重新哈希,从而提高性能

/**
	* Map<String,Object> mapList = new HashMap<>();
	* 同理可证:利用mapList在多线程下面跑会出现: java.util.ConcurrentModificationException(并发修改异常)
	* 解决方案:
	* 1.Map<String,Object> mapList = Collections.synchronizedMap(new HashMap<>());
	* 2.Map<String,Object> mapList = new ConcurrentHashMap<>();
*/
Map<String,Object> mapList = new ConcurrentHashMap<>();
for (int i=0; i<15;i++){
   new Thread(()->{
       mapList.put(UUID.randomUUID().toString().substring(1,6),UUID.randomUUID().toString().substring(1,6));
       System.out.println(Thread.currentThread().getName() + "---" + mapList);
   },String.valueOf(i)).start();
}
ConcurrentHashMap特点

1.线程安全性: ConcurrentHashMap是线程安全的,多个线程可以同时读取和修改ConcurrentHashMap而不需要额外的同步措施。
2.分段锁机制: ConcurrentHashMap内部采用了分段锁(Segment)的机制,将整个Map分成多个段(Segment),每个段相当于一个小的哈希表,不同的段可以由不同的线程同时操作,从而减小了锁的粒度,提高了并发性能。
3.可调整的并发级别: ConcurrentHashMap允许在创建时指定并发级别,即期望被多少线程同时访问。并发级别决定了ConcurrentHashMap内部分段的数量,从而影响了并发操作的效率。
4.支持高效的并发读取和修改: ConcurrentHashMap在进行读取操作时,不会阻塞其他读取操作;而在进行修改操作时,只会对涉及到的段加锁,而不会锁定整个Map,从而提高了并发读取和修改的效率。
5.不允许null键和null值: ConcurrentHashMap不允许存储null键和null值,如果尝试存储null键或null值,将会抛出NullPointerException。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

智慧园区水电能源监控管理系统

随着智慧城市的快速发展&#xff0c;智慧园区作为城市智能化的重要组成部分&#xff0c;其能源监控管理系统显得尤为关键。智慧园区水电能源监控管理系统&#xff0c;是利用先进的信息技术和自动控制技术&#xff0c;对园区内的水电能源使用进行实时监控、管理和优化的综合性智…

React 开发者必备技能之Redux基础入门实例

首先,我们需要安装 Redux 及其相关依赖: npm install redux react-reduxredux 是 Redux 库的核心部分,提供了创建 Store、Reducer、Action 等功能。react-redux 是 React 和 Redux 的集成库,用于在 React 组件中使用 Redux。 安装完成后,我们开始创建 Redux 应用程序: 创建 …

HarmonyOS 应用开发-应用异常处理案例

介绍 本示例介绍了通过应用事件打点hiAppEvent获取上一次应用异常信息的方法&#xff0c;主要分为应用崩溃、应用卡死以及系统查杀三种。 效果图预览 使用说明&#xff1a; 点击构建应用崩溃事件&#xff0c;3s之后应用退出&#xff0c;然后打开应用进入应用异常页面&#x…

分享|创业老阳推荐的Temu蓝海项目到底怎么样?

在当今竞争激烈的创业市场中&#xff0c;寻找一个具有潜力的蓝海项目成为了众多创业者的梦想。近日&#xff0c;创业老阳推荐的Temu蓝海项目引起了广泛关注。那么&#xff0c;这个项目到底怎么样呢?让我们一起来探讨一下。 首先&#xff0c;Temu蓝海项目在定位上具有显著优势 …

【数组】【最长距离】使循环数组所有元素相等的最少秒数

本文涉及知识点 数组 最长距离 LeetCode2808. 使循环数组所有元素相等的最少秒数 给你一个下标从 0 开始长度为 n 的数组 nums 。 每一秒&#xff0c;你可以对数组执行以下操作&#xff1a; 对于范围在 [0, n - 1] 内的每一个下标 i &#xff0c;将 nums[i] 替换成 nums[i] …

吴恩达深度学习 (week1,2)

文章目录 1、神经网络监督学习2、深度学习兴起原因3、深度学习二元分类4、深度学习Logistic 回归5、Logistic 回归损失函数6、深度学习梯度下降法7、深度学习向量法8、Python 中的广播9、上述学习总结10、大作业实现:rocket::rocket:&#xff08;1&#xff09;训练初始数据&…

初识Python(注释、编码规范、关键字...)

&#x1f947;作者简介&#xff1a;CSDN内容合伙人、新星计划第三季Python赛道Top1 &#x1f525;本文已收录于Python系列专栏&#xff1a; 零基础学Python &#x1f4ac;订阅专栏后可私信博主进入Python学习交流群&#xff0c;进群可领取Python视频教程以及Python相关电子书合…

2024年软考考纲改版后考试难度如何?

请注意&#xff1a;2024年软考只有两个资格的考纲发生了变化&#xff0c;分别是系统集成项目管理工程师&#xff08;中项&#xff09;和信息系统监理师&#xff0c;而且变化将在2024年下半年开始执行。其它资格的考纲保持不变&#xff01; 准备参加软考或者已经在备考的考生们…

什么时候考虑使用全局状态管理?vue获取全局状态变量一共有三种方法,你真的理解吗?

同学们可以私信我加入学习群&#xff01; 正文开始 前言一、场景二、设置state中的变量三、直接访问state中的变量四、通过getters访问变量五、通过actions访问变量六、总结总结 前言 本文给大家做个参考&#xff0c;什么时候会考虑使用全局状态管理&#xff1f;以及帮助大家理…

vue+springboot实现JWT登录验证

目录 前言概念实际演示路由信息初始访问登录界面登录验证验证过期 vue实现依赖引入main.js获取和设置token工具类登录方法实体登录方法axios请求 router配置 springboot实现依赖引入JWT工具类忽视jwt验证注解拦截器逻辑跨域&调用拦截器配置登录接口&验证token接口 结语…

初识SpringMVC

一、什么是MVC MVC是一种软件架构模式&#xff08;是一种软件架构设计思想&#xff0c;不止Java开发中用到&#xff0c;其它语言也需要用到&#xff09;&#xff0c;它将应用分为三块&#xff1a; M&#xff1a;Model&#xff08;模型&#xff09;V&#xff1a;View&#xff08…

自定义类型:结构体,位端

结构体内存对齐 结构体的对齐规则&#xff1a; 1. 第一个成员在与结构体变量偏移量为0的地址处。 2. 其他成员变量要对齐到某个数字&#xff08;对齐数&#xff09;的整数倍的地址处。 对齐数 编译器默认的一个对齐数 与 该成员大小的较小值。 VS中默认的值为8 Linux中没有默…

【Shell】各种条件语句的使用——test语句、if语句、case语句

Shell条件语句的使用 条件语句 Shell条件语句的使用条件测试的语法字符串测试表达式整数二元比较操作符逻辑操作符 if的条件语句的语法if的嵌套case语句语法 条件测试的语法 语法1&#xff1a;test <测试表达式> 利用test命令进行条件测试表达式的方法。test命令与<测…

外包干了25天,技术退步明显.......

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入杭州某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…

深入浅出 -- 系统架构之微服务标准组件及职责

我们来认识一下微服务架构在Java体系中依托哪些组件实现的。 相对于单体架构的简单粗暴&#xff0c;微服务的核心是将应用打散&#xff0c;形成多个独立提供的微服务&#xff0c;虽然从管理与逻辑上更符合业务需要。但微服务架构也带来了很多急需解决的核心问题&#xff1a; 1…

从“危”到“机”:HubSpot如何助企业转化出海营销CRM风险?

在全球化的大背景下&#xff0c;越来越多的企业选择出海拓展业务&#xff0c;以寻求更大的发展空间。然而&#xff0c;随着市场的扩大&#xff0c;企业在出海营销过程中也面临着各种风险。为了有效规避这些风险&#xff0c;许多企业选择借助HubSpot这样的专业营销软件。今天运营…

软文写作技巧,媒介盒子揭秘

数字化时代,想要获取用户的注意力难上加难&#xff0c;只有紧跟互联网的创作节奏&#xff0c;在软文写作中,根据用户的浏览偏好进行适当调整,让软文具有更高的审美性、易读性和启示性,才能有效地吸引当下受众的注意力。今天媒介盒子就来和大家聊聊软文写作技巧。 一、文章选题 …

C语言之自定义类型联合和枚举

目录 前言 一&#xff1a;联合体&#xff08;共用体&#xff09;union 1.联合体类型的声明 2.联合体的特点 3.联合体大小的计算 4.联合体判断机器的大小端 二&#xff1a;枚举enum 1.概念 2.枚举的优点 3.枚举的使用 接下来的日子会顺顺利利&#xff0c;万事胜意…

深度学习500问——Chapter06: 循环神经网络(RNN)(2)

文章目录 6.4 CNN和RNN的区别 6.5 RNNs与FNNs有什么区别 6.6 RNNs训练和传统ANN训练异同点 6.7 为什么RNN训练的时候Loss波动很大 6.8 标准RNN前向输出流程 6.9 BPTT算法推导 6.9 RNN中为什么会出现梯度消失 6.10 如何解决RNN中的梯度消失问题 6.4 CNN和RNN的区别 类别特点描述…