JUC之集合类

news/2025/3/13 4:17:02/

JUC包提供了一些并发安全的集合类,用于在多线程环境下进行共享数据的操作,以解决多线程间的竞争条件和线程安全问题。

CopyOnWriteArrayList

相当于线程安全的ArrayList

public class ListTest {public static void main(String[] arge){List<String> list = new ArrayList<>();for (int i=1;i<=10;i++){new Thread(()->{list.add(UUID.randomUUID().toString().substring(0,5));System.out.println(list);}).start();}}
}

编译报错:ConcurrentModificationException:并发修改异常

 解决方案:

        1.List<String> list = new Vector<>();

        2.List<String> list = Collections.synchronizedList(new ArrayList<>());

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

 其中Vector和Collections.synchronizedList都是使用synchronized,CopyOnWriteArrayList使用的volatile。

实现了List接口,因此它是一个队列;属于动态数组,在“添加/修改/删除”数据时,都会新建一个数组,并将更新后的数据拷贝到新建的数组中,最后再将该数组赋值给数组。

CopyOnWriteArraySet

它是线程安全的无序的集合,可以将它理解成线程安全的HashSet。

public class ListTest {public static void main(String[] arge){//Set<String> set = new HashSet<>();   //在多线程中:编译报错:ConcurrentModificationException:并发修改异常/*** 解决方案:*          1.Set<String> set = Collections.synchronizedSet(new HashSet<>());*          2.Set<String> set = new CopyOnWriteArraySet<>();*/Set<String> set = new CopyOnWriteArraySet<>();for (int i=1;i<=10;i++){new Thread(()->{set.add(UUID.randomUUID().toString().substring(0,5));System.out.println(set);}).start();}}
}

特点:

       1、CopyOnWriteArraySet包含CopyOnWriteArrayList对象,它是通过CopyOnWriteArrayList实现的。而CopyOnWriteArrayList本质是个动态数组队列,所以CopyOnWriteArraySet相当于通过动态数组实现的“集合”;
        2、怎么实现不允许重复:CopyOnWriteArrayList额外提供了addIfAbsent()和addAllAbsent()这两个添加元素的API,通过这些API来添加元素时,只有当元素不存在时才执行添加操作!
        3、至于CopyOnWriteArraySet的“线程安全”机制,和CopyOnWriteArrayList一样,是通过volatile和互斥锁来实现的。

ConcurrentHashMap

ConcurrentHashMap是线程安全的哈希表,它是通过“锁分段”来实现的

使用:

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


http://www.ppmy.cn/news/68517.html

相关文章

uniapp 地图组件(map)的使用总结

总结一下本次在uniapp中使用map遇到的一些问题 文章分别是基础 定位图标 获取自身经纬度 通过经纬度获取当时城市信息 首先先看成品 首先引入map组件 <template><view class"content"><map style"width: 100%; height: 90vh;" :layer-…

【利用AI让知识体系化】3万多字让你我快速入门数据结构与算法

文章目录 第一章&#xff1a;介绍数据结构与算法1.1 数据结构的概念1.2 算法的概念1.3 数据结构与算法的关系1.4 为什么需要学习数据结构与算法 第二章&#xff1a;时间与空间复杂度2.1 什么是时间复杂度2.2 时间复杂度的算法分析2.3 什么是空间复杂度2.4 空间复杂度的算法分析…

唐朔飞计算机组成原理常见的寄存器(时不时就更新)

EINT中断允许触发器 如果是1代表开中断就是可以中断 如果0表示关中断 不能触发中断程序&#xff0c;1.响应中断的条件是当设备有请求并且 中断允许触发器为1的时候 时间是指令执行周期结束的时候。2.实现多重中断的条件是 中断允许触发器置为1并且 有更高的服务程序才能除法多重…

Selenium+Unittest自动化测试框架实战(框架源码都给你)

目录 前言 项目框架 首先管理时间 !/usr/bin/env python3 -- coding:utf-8 -- 配置文件 conf.py config.ini# 读取配置文件 记录操作日志 简单理解POM模型 管理页面元素 封装Selenium基类 创建页面对象 熟悉unittest测试框架 编写测试用例 执行用例 生成测试报…

日常开发中代码技巧(个人使用)

日常开发中代码技巧 String&#xff0c;StringBuffer判断非空 String判断非空 参考&#xff1a;https://blog.csdn.net/Echo_width/article/details/79653704 首先&#xff0c;区分空串和null串 1 空串""是长度为0的字符串&#xff0c;它有自己的串长度&#xff08;…

协众信息ui设计岗位招聘要求有哪些?

UI设计师的工作是接到使用者轮廓、线框草稿后&#xff0c;创造出好看、好用的画面&#xff0c;视情况会搭配VisualDesigner&#xff08;视觉设计师&#xff09;&#xff0c;不过偶尔还是需要自己做图&#xff0c;包含插图、icon绘制等&#xff1b;透过设计过的画面&#xff0c;…

怎样设置CRM目标?有什么作用?

实施CRM系统可以帮助企业提高客户保留率&#xff0c;增加收入&#xff0c;并推动业绩增长。然而&#xff0c;在实施CRM系统之前&#xff0c;必须设定明确的目标&#xff0c;与企业的整体战略保持一致。在这篇文章中&#xff0c;我们来讨论实施CRM目标是什么&#xff0c;如何设定…

ChatGPT 国内版免费

ChatGPT 是最新的聊天机器人技术&#xff0c;它可以让你更快地完成各种任务。如果你想要一个在国内的免费版本&#xff0c;你来对地方了&#xff01;在这篇文章中&#xff0c;我们将会分享与你 ChatGPT的最新信息&#xff0c;以及在国内使用 ChatGPT 的方法。如果你想要了解更多…