【高并发系列】19、JDK并发容器 - 线程安全的HashMap、List

并发编程实战-为什么需要线程安全的容器 本文中我们给线程安全明确了定义,即“当多个线程访问某个类时,这个类始终能表现出正确的行为,那么这个类就是线程安全的”。了解了容器的分类,最重要的是以ArrayList为例探究了普通容器在多线程环境下会发生什么?以及线程安全的容器在多线程环境下是否是正确的。 阅读详情

1、Map

为防止多线程环境中使用HashMap出现问题,需要保证线程安全,可以使用Collections工具类下得synchronizedMap()方法:

public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) {
   return new SynchronizedMap<>(m);
}

返回的SynchronizedMap是Collections的私有静态内部类,使用委托,将所有map相关的功能交由传入的HashMap实现,而它只负责保证线程安全(使用synchronized关键字对所有操作加mutex锁),以下是部分源码:

private static class SynchronizedMap<K,V>
    implements Map<K,V>, Serializable {
    private static final long serialVersionUID = 1978198479659022715L;

    private final Map<K,V> m;     // Backing Map
    final Object      mutex;        // Object on which to synchronize

    SynchronizedMap(Map<K,V> m) {
        this.m = Objects.requireNonNull(m);
        mutex = this;
    }

    SynchronizedMap(Map<K,V> m, Object mutex) {
        this.m = m;
        this.mutex = mutex;
    }

    public int size() {
        synchronized (mutex) {return m.size();}
    }
    public boolean isEmpty() {
        synchronized (mutex) {return m.isEmpty();}
    }

    ...
}

虽然可以满足线程安全要求,但性能因为mutex的锁原因不算太好;

如果并发级别不高,一般可以使用,但在高并发环境中,可以使用ConcurrentHashMap类;

2、List

ArrayList和Vector都使用数组作为内部实现,但Vector是线程安全的,而ArrayList不是;

LinkedList使用链表结构实现了List,但不是线程安全的;

可以使用Collections.synchronizedList()方法来包装List:

public static <T> List<T> synchronizedList(List<T> list) {
    return (list instanceof RandomAccess ?
            new SynchronizedRandomAccessList<>(list) :
            new SynchronizedList<>(list));
}

与上面讲到的线程安全的Map类似,区别在于ArrayList和Vector实现了RandomAccess,而LinkedList没有实现,底层还是一样的:

static class SynchronizedRandomAccessList<E> extends SynchronizedList<E> implements RandomAccess
static class SynchronizedList<E>
    extends SynchronizedCollection<E>
    implements List<E> {
    private static final long serialVersionUID = -7754090372962971524L;

    final List<E> list;

    SynchronizedList(List<E> list) {
        super(list);
        this.list = list;
    }
    SynchronizedList(List<E> list, Object mutex) {
        super(list, mutex);
        this.list = list;
    }

    public boolean equals(Object o) {
        if (this == o)
            return true;
        synchronized (mutex) {return list.equals(o);}
    }
    public int hashCode() {
        synchronized (mutex) {return list.hashCode();}
    }

    ...
}

 

并发编程之并发容器(Map、List、Set)实战及其原理 并发容器(Map、List、Set)实战及其原理 阅读详情

相关推荐

第一篇:并发容器学习开篇介绍

本文简单概述了Java并发包下的一些常用的类。后续的博客将围绕着这些类来剖析。

码农飞哥 3789

《Java高并发与集合框架》第三部分在高并发场景中工作的集合

高并发场景中的集合,其优先关注的问题通常不是集合的整体性能,而是工作的稳定性和在特定场景中的高性能。我们知道,Queue接口是BlockingQueue接口的父级接口,前者定义了一些与队列有关的接口,后者在此基础上补充了一些接口功能,Queue接口的主要方法如下。

Blue_Pepsi_Cola的博客 1518

小蔺的米哈游数据分析师之路——MYSQL篇

作为新人,记录自己mysql学习历程

weixin_47070228的博客 434

List在高并发场景下保证线程安全的三种方案,CopyOnWriteArrayList写时复制读写分离

Java并发修改异常:java.util.ConcurrentModificationExpection vector线程安全但是是JDK1.0诞生 arrayList线程不安全但是是JDK 1.2诞生 Collection是一个接口 Collections是一个辅助工具类 目前两种解决方案:new vector<>(); collctions.synchronizedList(new ArrayList<>()); 还有改错思路思想 //list线程不安全问题,已经举一个不安全的

Avril___的博客 1734

实验三 Gmapping建图

自主移动机器人第三次实验课,内容包括:(1)turtlebot的gmapping建图;(2)rosbag的使用;(3)gazebo中的gmapping建图。

lj164567487的博客 4649

深入RK3588嵌入式Linux开发:uboot源码定制化移植实战

本文详细介绍了RK3588嵌入式Linux开发中,如何绕过庞大的官方SDK,从官方仓库获取纯净U-Boot源码并进行定制化移植的完整实战流程。内容包括编译环境搭建、交叉工具链配置、源码结构解析、设备树(Device Tree)修改、环境变量定制、编译脚本编写以及常见问题调试技巧,旨在帮助开发者深入理解系统引导过程,掌握为定制硬件适配U-Boot的核心技能。

weixin_29169505的博客 423

java中有哪些并发的List?只知道一种的就太逊了

Java提供了多种支持并发的容器,如ArrayList、CopyOnWriteArrayList、ConcurrentLinkedDeque。了解它们的用法和性能特点对于编写高效的多线程程序至关重要。选择正确的容器可以显著提高应用程序的性能和可靠性。更多内容请参考最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

程序那些事 460

智能客服系统知识库数据清洗

数据清洗(Data Cleaning)是确保智能客服知识库高效运行的重要环节,主要涉及。| 分类 & 标签优化 | 重新组织 FAQ,创建关键字索引 || 定期更新 | 结合用户反馈,每 1-3 个月优化 |才能提供更优质、正确的回答,提升客户满意度!、Zendesk、Intercom 等)中,: FAQ 或客服回答中可能存在。,会影响 AI 匹配的准确性。是一个持续优化的过程,

z1941563559的博客 2099

集合框架的线程安全问题ArrayList、HashSet、HashMap

ArrayList、HashSet、HashMap 使用ArrayList 运行结果很明显可与看到有线程安全问题 使用CopyOnWriteArrayList CopyOnWriteArrayList 解决了线程安全问题

weixin_58286934的博客 487

【Codecs系列】x265编码器(十二):子像素运动搜索

在基于块运动补偿的视频编码框架中,运动搜索是最为重要的环节之一,同时也是编码端最为耗时的模块。运动搜索包括整像素运动搜索和子像素运动搜索,其中整像素运动搜索已经有很多快速算法,比如经典的三步搜索法、菱形搜索、六边形搜索以及TZSearch等等;但子像素搜索的快速算法却比较少,本文主要讲解x265编码器中的子像素搜索方法以及相关的快速搜索方法。

优快云明星博主,认证博客专家,视频、Matlab领域优质创作者。 749

基于MATLAB的拉盖尔-高斯光束叠加相位模拟

首先,我们需要设置模拟所需的参数,如光腰半径、传播距离、光束的角动量等。其中,(U)表示光束的电场复振幅,(r)和(\phi)分别是极坐标系下的径向和角向坐标,(z)是传播距离,(A)是归一化系数,(w_p)是光束的光腰半径,(L_p^q)是拉盖尔多项式,(k)是波数,(l)是光束的角动量。通过修改模拟参数,如光腰半径、传播距离、角动量等,您可以进一步探索和理解拉盖尔-高斯光束的叠加相位效应。拉盖尔-高斯光束是一种特殊的光束模式,具有广泛的应用领域,包括光学信息处理、激光加工和量子光学等。

m0_47037246的博客 945

java高并发list_java秒杀高并发

防止瞬间的访问首先去缓存中取,找到直接返回,没有就渲染返回,在缓存比如商品列表,访问的话是 goods_list 模板将数据放到 model中然后去渲染模板改为 直接返回 html先创建一个对商品的前缀,用于存入 redis中GoodsKey设置,设置默认缓存。60spublic class GoodsKey extends BasePrefix {private GoodsKey(int exp...

weixin_35798040的博客 487

V4L2教程(1):Ubuntu V4L2开发环境搭建与设备探索

欢迎来到V4L2学习指南的第一篇!本文将带你从零开始,在Ubuntu系统上搭建完整的V4L2视频采集开发环境。无论你是想开发视频监控、视频会议还是机器视觉应用,掌握V4L2都是Linux视频开发的必经之路。 **本节学习目标**: - 理解V4L2的基本概念和架构 - 搭建Ubuntu下的V4L2开发环境 - 掌握v4l2-ctl等调试工具的使用 - 学会检测和配置USB摄像头设备

琅嬛福地 417

JAVA高并发——JDK的并发容器

并发集合、深入解析ConcurrentHashMap、深度剖析ConcurrentLinkedQueue类、不变模式下的CopyOnWriteArrayList类、数据共享通道:BlockingQueue、跳表(SkipList)

码说芯语的博客 1343

大模型——dify实战通过dify搭建你自己的图片识别服务

本文介绍了如何通过Dify平台搭建图片识别服务。首先创建工作流,添加支持图片上传的字段,并配置视觉模型qwen-vl-max-latest进行图像分析。文章详细说明了各步骤操作,包括字段设置、模型选择、提示词编写等。在测试阶段发现URL解析问题后,提供了解决方案:修改Dify的.env文件,调整FILES_URL配置并重启服务。最终成功实现上传图片或输入图片链接后,AI能够准确分析并返回简洁的图片内容描述。这一方案适用于需要快速部署图像识别功能的场景。

1926

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

一篇文章带你认识 JDK 的并发容器

除了提供诸如同步控制、线程池等基本工具外,为了提高开发人员的效率,JDK还为大家准备了一大批好用的容器类,可以大大减少开发工作量。大家应该都听说过一种说法,所谓程序就是“算法+数据结构”,这些容器类就是为大家准备好的线程数据结构。你可以在里面找到链表、HashMap、队列等。当然,它们都是线程安全的。 文章目录一、 一、 ...

南淮北安的博客 446

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

java高并发编程——JDK并发容器

一、并发集合简介   JDK的并发容器大部分都在java.util.concurrent包中。 1.ConcurrentHashMap:一个高效的HashMap,可以理解为线程安全的HashMap。 2.CopyOnWrtieArrayList:与ArrayList相似,在读多谢少的场景中,性能比Vector好很多。 3.ConcurrentLinkedQueue:高效的并发队列,使用链表实现,可...

qq_34459728的博客 282

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

容器(二)

Java 208 道面试题 · 容器   18. java 容器都有哪些? 常用容器的图录:   19. Collection 和 Collections 有什么区别? java.util.Collection 是一个集合接口(集合类的一个顶级接口)。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collecti...

Jack方 16万+

Java高并发(三.三)--JDK并发容器

JDK并发容器 ConcurrentHashMap:线程安全的HashMap Collections.synchronizedMap() public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) { return new SynchronizedMap<>(m); } Synchronize...

Athazement的博客 277

Java JUC并发集合详解:线程安全容器完全指南

Java并发容器(JUC)提供线程安全的高性能集合类,包括ConcurrentHashMap(分段锁/CAS优化)、阻塞队列(Array/LinkedBlockingQueue)、非阻塞队列(ConcurrentLinkedQueue)和写时复制集合(CopyOnWriteArrayList)。相比传统同步方式,JUC通过锁分离、CAS无锁算法等实现更高并发性。选型需考虑数据结构特性(Map/Queue/List)、是否需要有序/阻塞,以及读写比例,优先选用JUC而非同步包装类,以提升多线程环境下的程序性能

zyyyyyhhhhh的博客 1172

并发容器(Map、List、Set)实战及其原理分析

并发容器(Map、List、Set)实战及其原理分析

Zhuxiaoyu_91的博客 1425

Java多线程并发之同步容器和并发容器-第一篇

Java多线程并发之同步容器和并发容器-第一篇 概述 本文主要讲解在Java多线程并发开发中,集合中有哪些支持并发的的。什么是同步容器(集合),什么是并发容器(集合)?并发容器分类有哪些?每个分类都有哪些类? 本文是《凯哥分享Java并发编程之J.U.C包讲解》系列教程中的第五篇。如果想系统学习,凯哥(kaigejava)建议从第一篇开始看。 从本篇开始,我们就来讲解讲解Java的并发容器。大致思路:先介绍什么是并发容器。然后讲解list相关的、map相关的以及队列相关的。这个系列会有好几篇文章。大

tomfyyds的博客 621

【高并发专题】-java线程安全-线程安全策略

1.使用单例确保发布对象的安全 单例是最为常见的一种设计模式,关于单例也有非常多种实现方式,平时看到最多的就是饿汉式和懒汉式,我在前面的设计模式章节有详解,这里不多说,我这里仅提一下一种基于饿汉式的改进单例,具有诸多优点,在spring源码中亦有大量使用.是采用枚举的方式实现的单例,好处显而易见,我们在传统的饿汉式实现方式中,虽然解决了线程安全问题,但是饿汉式不能做到在调用时才创建对象,有时对象...

老汉健身的博客 441

并发编程必备:精通JDK并发容器的使用和策略

并发编程是现代软件开发中不可或缺的一部分,它允许多线程同时访问和修改数据,但这也引入了复杂性,尤其是在容器(如List、Set、Map和Queue)这些共享数据结构的使用上。为了解决并发环境下的竞态条件和数据同步等问题,Java提供了一系列的线程安全容器,即并发容器。

逆流的小鱼 324

Java工具并发容器

JDK 1.7 中, ConcurrentHashMap 类中包含静态内部类 Segment,继承于 ReentrantLock 类用来充当锁的角色,每个 Segment 对象守护若干个保存键值对的链表,共同构成 ConcurrentHashMap 实例中的数组。【阻塞队列】被广泛使用在“生产者-消费者”问题中,其原因是 BlockingQueue 提供了可阻塞的插入和移除的方法。Java 提供的基础容器都是线程不安全的,如果并发条件下多个线程同时对一个容器中的数据进行操作,可能会导致各种意想不到的错误。

2401_84881237的博客 1233

并发编程——11 并发容器(Map、List、Set)实战及其原理分析

CopyOnWriteArrayList(扩展知识:迭代器的`fail-fast`与`fail-safe`机制)、ConcurrentHashMap、ConcurrentSkipListMap(跳表)、电商场景中并发容器的选择

念头通达 1056
上一篇: 【高并发系列】18、线程池那些事儿2 - 内部实现
下一篇: 【高并发系列】20、JDK并发容器 - ConcurrentLinkedQueue
hellboy0621
博客等级 码龄9年 61粉丝 147原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值