常见的并发集合(java.util.concurrent)

1.CopyOnWriteArrayList

1.1 并发修改时保证线程安全:
  • 通过ReentrantLock实现多个线程并发修改时的线程安全同步(添加元素的同时,不允许删除)
  • 添加新元素:list.add("")
  • 按照指定下标替换元素:list.set(index, element)
  • 按照指定下标删除元素:list.remove(0)
1.2 并发读取:

没有加锁,允许多个线程同时并发读取;但是读取时,可能产生脏读(读取的同时,允许写入操作)。

1.3 CopyOnWrite思想:

修改时将原数组内容复制Copy到新数组内,在新数组内修改,然后替换

2.CopyOnWriteArraySet

CopyOnWriteArraySet内部通过一个CopyOnWriteArrayList实现 

3.BlockingQueue阻塞队列

阻塞队列:由两个线程,分别进行读写(task和put)操作;读取时,不允许写入,如果队列为空,则读取线程阻塞;写入时,不允许读取,如果队列已满,则写入线程阻塞;

ArrayBlockingQueue---有界队列

LinkedBlockingQueue---无界队列

4.ConcurrentHashMap

4.1 JDK1,7是通过分段锁实现线程安全

4.2 JDK1,8通过 synchronized+CAS实现线程安全

  • 当产生哈希冲突时,通过synchronized将根节点作为锁,进行线程的同步安全
  • 在没有产生哈希冲突时,通过CAS进行无锁化操作,降低synchronized进行线程同步操作所引发的性能下降

面试总结

1.集合中哪些类是线程安全的?

List接口的线程安全实现类:

  • Vector :使用 synchronized 同步锁实现线程安全的 List 集合,数据结构是 0bject[]数组;
  • Stack: Vector 的子类,是一个实现线程安全并且符合 FIL0 特点的 stack 栈结构,数据结构是 0bject[]数组;
  • CopyOnWriteArrayList :使用 ReentrantLock实现写入操作( Write )线程安全的 List 集合,数据结构是 0bject[]数组;

Set接口的线程安全实现类:

  • CopyOnWriteArrayset:内部采用CopyOnWriteArrayList实现

Queue 接口的线程安全实现类:

  • ConcurrentLinkedQueue:通过CAS 实现线程安全,数据结构是单向链表;
  • ArrayBlockingQueue :有界阻塞队列,通过 ReentrantLock 实现读写操作的线程安全和阻塞操作,数据结构是 0bject[]数组;
  • LinkedB1ockingQueue :无界阻塞队列,通过 ReentrantLock 实现读写操作的线程安全和阳塞操作,数据结构是双向链表;

Map 接口的线程安全实现类:

  • Hashtable :使用 synchronized 同步锁实现线程安全,数据结构是数组+链表;
  • ConcurrentHashMap :使用 synchronized 同步锁+ CAS 实现线程安全,数据结构是数组+链表+ 红黑树;

 2.什么是阻塞队列

基本介绍
BlockingQueue是并发工具包 java.util.concurrent 中提供的一种线程安全的队列实现,它主要用于生产者-消费者模式中,为多线程应用提供了一种高效和安全的方式来管理共享资源。
BlockingQueue 的主要特点是当队列满时,生产者线程会被阻塞,直到有消费者线程消费了队列中的元素,或者等待超时;
同样,当队列空时,消费者线程会被阻塞,直到有生产者线程添加了新的元素,或者等待超时。

实现类

  • BlockingQueue 有几个不同的实现类,包括:
  • ArrayBlockingQueue:基于数组的有界阻塞队列。
  • LinkedBlockingQueue :基于链表的有界或无界阻塞队列。
  • PriorityBlockingQueue :具有优先级的无界阻塞队列,元素需要实现Comparab1e接口。
  • DelayQueue :保存 Delayed 类型的元素的无界阻塞队列,元素只有在其延迟过期后才能被消费者线程消费。
  • SynchronousQueue :不存储元素的阻塞队列,每个插入操作必须等待另一个线程的相应移除操作,反之亦然。

使用场景

  • 生产者-消费者模式:在多线程环境下,生产者生成数据,消费者消费数据,中间使用 BlockingQueue作为缓冲,以实现数据的异步处理和解耦。
  • 工作任务队列:在多线程任务调度中,可以使用 BlockingQueue来存放待执行的任务,例如 ThreadPoolExecutor 就使用了Blockingqueue 来管理任务队列。
  • 流量控制和限流:在网络通信中,使用BlockingQueue可以限制发送或接收数据的速率,防止数据溢出。

3.什么是CopyOnWriteArrayList?

  • CopyOnWriteArrayList 是 java.util.concurrent 并发包提供的线程安全的 List 集合容器,兼顾安全与性能,用于在线程安全场景下取代 Vector和 ArrayList;
  • CopyOnWriteArrayList在add()set()、remove()等写入操作中,通过 ReentrantLock加锁,通过COW机制完成数据的写入操作;
  • CopyOnWriteArrayList在 get()等读取方法中,没有加锁,允许并发读取,
  • Copy0nWriteArrayList 适合读多写少的应用场景; 

4.CopyOnWriteArrayList有什么缺点?

内存占用:如果 copyonWriteArrayList 经常要增删改集合中的数据,执行 add()、都需要复制一个新数组,比较耗费内存:set()、remove()方法,每次
数据一致性: copyonwrite 容器只能保证数据的最终一致性,不能保证数据的实时一致性。因为增删改等写入操作的目标是新数组,在没有完成的同时,读取操作的目标仍然是原数组: 

5.CopyOnWriteArrayList 实现原理?

  • Copy0nWriteArrayList的所有写入操作(add,set 等)都是通过 ReentrantLock 加锁,保证线程安全
  • 它的执行流程是:在写入操作时,首先复制出一个新数组,然后在新数组中进行写入操作后,最后用新数组替换原数组, 

6.CopyOnWriteArrayList为什么并发安全且性能比Vector好?

  • Vector 是增删改查方法都加了synchronized,保证同步,每个方法执行的时候都要去获取锁,性能就会大大降低
  • Copy0nWriteArrayList 仅仅是在增删改方法中使用 ReentrantLock 锁,但是读操作不加锁,支持并发读; 

7.谈谈ConcurrentHashMap的理解?

  • ConcurrentHashMap 是一个线程安全并且性能效率比较高的 Map集合;
  • ConcurrentHashMap利用synchronized、 volatile、 CAS实现线程安全,同时减少锁竟争对于性能的影响: 

8.ConcurrentHashMap的实现原理?

ConcurrentHashMap在IDK1.7和JDK1.8 采用了两种不同的实现方式:
JDK1,7 :数据结构是 segment 分段数组+链表。它采用分段锁( Segment)对数组进行分割分段,每一把锁只锁容器其中一
部分数据,多线程访问容器里不同数据段的数据,就不会存在锁竞争,提高并发访问率,最大并发数量为 Segment 的个数,默认
是16;

JDK1.8:数据结构是数组+链表+红黑树,它使用 synchronized 和CAS 来进行并发控制。允许多个线程并发访问 ConcurrentHashMap 。只有在产生哈希冲突后才会锁定产生哈希冲突的链表或红黑二又树的首节点,控制锁定的synchronized范围。只要不产生哈希冲突,就不会产生锁竞争,提高并发效率,最大并发数量是数组的大小;

9.ConcurrentHashMap和HashMap的区别?

ConcurrentHashMap 和HashMap 都是键值对集合,它们主要区别包括:
线程安全

  • HashMap :是非线程安全的。在多线程环境下,如果没有 synchronized 块或 ReentrantLock 等外部锁机制,那么在并发写入时可能会导致数据不一致或异常(ConcurrentModificationException);
  • ConcurrentHashMap :是线程安全的。它允许多线程安全地进行读写操作,而无需额外的同步代码

数据结构

  • HashMap :数据结构使用数组+链表+红黑树,当链表长度超过一定阈值时,链表会转化为红黑树以提高查找效率,
  • ConcurrentHashMap :数据结构使用数组+链表+红黑树,使用 synchronized 和CAS 来确保线程安全;

对 nu11 的支持

  • HashMap :允许使用 nu11 做 key 或value
  • ConcurrentHashMap:不允许nu11键或nu11值:

性能

  • 单线程场景中:HashMap 性能好,避免了锁带来的性能开销;ConcurrentHashMap
  • 多线程场景中:HashMap 不安全,ConcurrentHashMap 兼顾了安全与性能; 

10.ConcurrentHashMap 和Hashtable的区别?

数据结构

  • ConcurrentHashMap :数组+链表+红黑树;
  • Hashtable :数组+链表;

线程安全方式

  • ConcurrentHashMap
    • JDK1.8:使用 synchronized 和CAS来进行并发控制。允许多个线程并发访问ConcurrentHashMap,只有在产生哈希冲突后,synchronized 才会锁定产生哈希冲突的链表或红黑二叉树的首节点,控制锁定的范围;
  • Hashtable
    • 使用 synchronized 来保证线程安全,只允许一个线程访问Hashtable,其它并发线程只能阻塞;

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

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

相关文章

【Python调用ddddocr打包成exe文件指定模型库及注意事项】

ddddocr 打包成 exe 后一直存在各种各样的问题,例如: ddddocr\common.onnx failed. File doesn’t exist 查阅资料后,问题得到解决。但相关资料不多,且不够详细,特写下本文,以便于后来者解决问题。 希望本文…

java -----泛型

泛型的理解和好处 泛型是在JDK5之后引入的一个新特性&#xff0c;可以在编译阶段约束操作的数据类型&#xff0c;并进行检查。 泛型的格式为 <数据类型> import java.util.ArrayList;SuppressWarnings({"all"}) public class Generic02 {public static void…

【iOS】MVC架构模式

文章目录 前言MVC架构模式基本概念通信方式简单应用 总结 前言 “MVC”&#xff0c;即Model&#xff08;模型&#xff09;&#xff0c;View&#xff08;视图&#xff09;&#xff0c;Controller&#xff08;控制器&#xff09;,MVC模式是架构模式的一种。 关于“架构模式”&a…

【有奖问答 / B】

题目 DP代码 #include <bits/stdc.h> using namespace std; int f[35][100]; int sum; int main() {f[0][0] 1;for (int i 1; i < 30; i){for (int j 0; j < 90; j){f[i][0] f[i - 1][j];if (j 10 < 90)f[i][j 10] f[i - 1][j];}sum f[i][70];}cout &l…

动手学深度学习9.1. 门控循环单元(GRU)-笔记练习(PyTorch)

本节课程地址&#xff1a;门控循环单元&#xff08;GRU&#xff09;_哔哩哔哩_bilibili 本节教材地址&#xff1a;9.1. 门控循环单元&#xff08;GRU&#xff09; — 动手学深度学习 2.0.0 documentation (d2l.ai) 本节开源代码&#xff1a;...>d2l-zh>pytorch>chap…

信息学奥赛复赛复习01-CSP-J2019-01-字符、字符数组、字符串、string、字符串读取

PDF文档回复:20240923 1 2019 CSP-J 题目1 数字游戏 [题目描述] 小 K 同学向小 P 同学发送了一个长度为 8 的 01 字符串来玩数字游戏&#xff0c;小 P 同学想要知道字符串中究竟有多少个 1。 注意&#xff1a;01 字符串为每一个字符是 0 或者 1 的字符串&#xff0c;如 101 …

文心智能体搭建步骤

通过使用文心智能体平台来创建智能体的过程。这种方法可以让没有编程经验的人也能快速构建智能体&#xff0c;降低了技 术门槛。以下是一些建议和心得: 1.选择合适的平台:文心智能体平台是一个优秀的选择&#xff0c;它提供了零代码和低代码的开发环境&#xff0c;极大地降低了…

vue中高德地图使用 Marker 标点 - 标点数据快到 1000 时页面卡顿问题解决(已解决 - 多方面原因)+ 海量点功能实现解决

目录 1.业务需求2.最初实现及出现的问题3.解决 - 1000 个标点时页面就出现 卡顿 问题4.使用海量点、聚合标点后还有卡顿&#xff0c;排查其他原因5.最终解决5.1页面中list数据渲染问题解决5.2地图相关实例不要放在 vue 的可响应数据中 页面展示 1.业务需求 需要在 高德地图 中标…

【linux驱动】什么是驱动

内核简介 在谈驱动之前&#xff0c;我们需要先谈内核。 内核&#xff0c;是一个操作系统的核心。是基于硬件的第一层软件扩充&#xff0c;提供操作系统的最基本的功能&#xff0c;是操作系统工作的基础&#xff0c;决定着整个操作系统的性能和稳定性。 下面是微内核和宏内核…

oracle avg、count、max、min、sum、having、any、all、nvl的用法

组函数 having的使用 any的使用 all的使用 nvl 从执行结果来看&#xff0c;nvl(列名&#xff0c;默认值)&#xff0c;nvl的作用就是如果列名所在的这一行出现空则用默认值替换

Offer60:n个骰子的点数

题目&#xff1a;把n个骰子扔在地上&#xff0c;所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。 分析:要解决这个问题&#xff0c;我们需要先统计出每个点数出现的次数&#xff0c;然后把每个点数出现的次数除以,就能求出每个点数出现的概率了。我们…

day-58 最接近的三数之和

思路 双指针&#xff1a;首先利用Arrays.sort()函数对数组进行排序&#xff0c;通过枚举中间位置的那个数&#xff0c;题目就变为了双指针 解题过程 指针边界&#xff08;right>i&&left<i&#xff09;&#xff0c;当三数之和小于等于target时&#xff0c;left,反…

电力系统中有哪些好的运维的平台?

摘要&#xff1a;介绍台商大厦&#xff0c;采用综合保护装置、多功能仪表、变压器温控仪、直流屏、烟雾传感器、门磁开关、网络摄像头等设备&#xff0c;采集配电现场的各种电参量和状态信号。系统采用现场就地组网的方式&#xff0c;组网后通过现场网关远传至阿里云平台&#…

精神分裂症、抑郁症和异常衰老的脑电信号特征:一项监督式机器学习研究

摘要 背景&#xff1a;EEG是一种非侵入性、成本效益高且稳健的工具&#xff0c;能够以高时间分辨率直接测量体内神经元的整体活动。结合先进的机器学习(ML)技术&#xff0c;EEG记录可以提供有关精神疾病的计算机模拟生物标志物。 假设&#xff1a;病理性和生理性衰老过程会影…

CMake 构建Qt程序弹出黑色控制台

CMake 构建Qt程序弹出黑色控制台

OpenBayes 一周速览|IC-Light 图片打光神器一键启动!Tecnalia 电子设备废物高光谱数据集上线,提高电子废物回收准确性

公共资源速递 This Weekly Snapshots &#xff01; 5 个数据集&#xff1a; * BTAD 工业异常数据集 * WebVid 大型短视频数据集 * bAbi 问答和文本理解的数据集 * OpenMIR 音乐收听脑电图数据集 * Tecnalia 电子设备废物高光谱数据集 2 个教程&#xff1a; * ComfyUl …

随机掉落的项目足迹:Vue3 + wangEditor5富文本编辑器——toolbar.getConfig() 查看工具栏的默认配置

问题引入 小提示&#xff1a;问题引入是一个讲故事的废话环节&#xff0c;各位小伙伴可以直接跳到第二大点&#xff1a;问题解决 我的项目不需要在富文本编辑器中引入添加代码块的功能&#xff0c;于是我寻思在工具栏上把操作代码的菜单删一删 于是我来到官网文档工具栏配置 …

vue-baidu-map的基本使用

前言 公司项目需求引入百度地图&#xff0c;由于给的时间比较短&#xff0c;所以就用了已经封装好了的vue-baidu-map 一、vue-baidu-map是什么&#xff1f; vue-baidu-map是基于vue.js封装的百度地图组件(官方文档) 二、使用步骤 1.下载插件 //我下载的版本 npm install …

CTO来分享:创业公司,如何提升MVP新产品开发速度?

创业公司的MVP新产品开发之路 对于创业公司&#xff0c;资源有限、早期项目概念模糊&#xff0c;加上人员不足&#xff08;甚至是只有创始人自己一人&#xff09;&#xff0c;如何能在短时间内、低成本、快速上线自己的MVP产品&#xff0c;验证产品和市场的匹配度&#xff0c;…

淘宝商品评论数据获取API接口响应参数列表展示(可测key)

item_review-获得淘宝商品评论 在电商领域&#xff0c;商品评论数据是商家和消费者都极为关注的重要信息。通过这些数据&#xff0c;商家可以了解产品的市场反馈&#xff0c;优化产品和服务&#xff1b;而消费者则可以参考其他用户的评价&#xff0c;做出更明智的购买决策。然…