并发-并发容器

Java并发容器总结 Java容器并发管理探究 文章主要探讨Java中Map容器的并发问题,重点分析JDK7版本HashMap的实现机制及潜在并发风险。 JDK7 HashMap核心机制 数据结构:数组+链表,采用头插法处理哈希冲突 扩容过程:创建新数组后通过transfer方法迁移元素,使用头插法重新排列链表 并发扩容风险 多线程环境下扩容时可能出现循环链表问题: 线程A和线程B同时扩容 头插法操作导致节点相互引用 后续查询操作触发无限循环,造成CPU 100% 该问题源于JDK7版本的非线程安全设计,后续版本通过改进数据结构 阅读详情

ArrayList并发遇到的问题

package com.yg.edu.list;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;


public class CopyOnWriteArrayListRunner {
    /**
     * 读线程
     *
     */
    private static class ReadTask implements Runnable {
        List<String> list;

        public ReadTask(List<String> list) {
            this.list = list;
        }

        public void run() {
            for (String str : list) {
                System.out.println(str);
            }
        }
    }
    /**
     * 写线程
     *
     */
    private static class WriteTask implements Runnable {
        List<String> list;
        int index;

        public WriteTask(List<String> list, int index) {
            this.list = list;
            this.index = index;
        }

        public void run() {
            list.remove(index);
            list.add(index, "write_" + index);
        }
    }

    public void run() {
        final int NUM = Runtime.getRuntime().availableProcessors();
        System.out.println(NUM);
//        List<String> list = new CopyOnWriteArrayList<>();//new ArrayList<String>();
        List<String> list = new ArrayList<>();//new ArrayList<String>();

        for (int i = 0; i < NUM; i++) {
            list.add("main_" + i);
        }
        ExecutorService executorService = Executors.newFixedThreadPool(NUM);
        for (int i = 0; i < NUM; i++) {
            executorService.execute(new ReadTask(list));
            executorService.execute(new WriteTask(list, i));
        }
        executorService.shutdown();
    }

    public static void main(String[] args) {
        new CopyOnWriteArrayListRunner().run();
    }
}

优化版本1 :针对读写分别加ReentrantLock,存在粒度过大的问题 针对读写分别ReentrantLoc,存在粒度过大的问题
优化版本2 :针对读写都比较多的场景,ReentrantReadWriteLock
优化版本3:针对读多写少的场景,CopyOnWriteArrayList

  • CopyOnWrite机制

核心思想:读写分离,空间换时间,避免为保证并发安全导致的激烈的锁竞争。
划关键点:
1、CopyOnWrite适用于读多写少的情况,最大程度的提高读的效率;
2、CopyOnWrite是最终一致性,在写的过程中,原有的读的数据是不会发生更新的,只有新的读
才能读到最新数据;
3、如何使其他线程能够及时读到新的数据,需要使用volatile变量;
4、写的时候不能并发写,需要对写操作进行加锁;

  • ConcurrentHashMap

HashMap数据结构

1.7-hashtable = 数组(基础) + 链表   单线程扩容的时候头插法会出现顺序反了的问题;多线程扩容导致形成的链表环---死锁问题。

(>=)1.8 = 数组 + 链表 + 红黑树

优先扩容;当链表长度达到一定长度时,转换为红黑树。

1.7 分段锁(ReentrantLock)+数组(基础) + 链表 

1.8  synchronized+CAS+HashEntry+红黑树,


常见问题

  • jdk1.8为什么会抛弃分段锁,它有什么毛病吗?

在一个ConcurrentHashMap创建后Segment的个数是不能变的,扩容过程过改变的是每个Segment的大小。

分成很多段时会比较浪费内存空间(不连续,碎片化); 操作map时竞争同一个分段锁的概率非常小时,分段锁反而会造成更新等操作的长时间等待; 当某个段很大时,分段锁的性能会下降

  • 知道红黑树的transfer过程么?简单的描述一下

参考链接:

​​​​​​JDK8的 CHM 为何放弃分段锁_普通网友的博客-优快云博客_jdk8为什么不用分段锁了

同步类容器和并发类容器 一.为什么会出现同步容器? 在Java的集合容器框架中,主要有四大类别:List、Set、Queue、Map。 注意Collection和Map是顶层接口,而List、Set、Queue接口则分别继承了Collection接口,分别代表数组、集合和队列这三大类容器。 像ArrayList、LinkedList都是实现了List接口,HashSet实现了Set接口,而Deque(双向队列,允许... 阅读详情

相关推荐

并发容器的原理,7大并发容器详解、及使用场景

并发容器的原理,7大并发容器详解、及使用场景 http://youzhixueyuan.com/use-of-concurrent-containers.html 并发容器的由来 在Java并发编程中,经常听到Java集合类,同步容器、并发容器,那么他们有哪些具体分类,以及各自之间的区别和优劣呢? 只有把这些梳理清楚了,你才能真正掌握在高并发的环境下,正确使用好并发容器,我们先从Java集...

jiaoyajieqianyi的博客 1321

并发容器(一):普通容器&&同步容器&&并发容器

并发容器

左灯右行的爱情 415

Java高并发编程实战8,同步容器与并发容器

Java基础教程系列,打造精品专栏。

学Java,找哪吒 1万+

java常见并发容器

分类介绍java并发容器。

qiukuqiuku的博客 3126

Java并发编程:从同步容器到并发容器的演进

本文将深入探讨Java中的同步容器和并发容器,包括它们的概念、工作原理、使用方法以及性能分析。我们将从同步容器的基础开始,逐步介绍并发容器的出现和演进,最后讨论如何在实际开发中选择合适的容器,并提供一些最佳实践和未来发展的展望。通过本文,读者将能够更好地理解Java并发编程中容器的重要性和如何有效地利用它们来提高程序的并发性能和线程安全性。

fudaihb的博客 1601

并发容器

文章目录一.同步容器二.并发容器2.1 List2.2 Map2.3 Set2.4 Queue 一.同步容器 Java中的容器主要可以分为四大类,分别是List、Map、Set和Queue,但并不是所有的Java容器都是线程安全的,例如:我们常用的ArrayList、HashMap就不是线程安全。 保证容器线程安全方法 把非线程安全的容器封装在对象内部,控制访问路径。 SafeArrayList<T>{ //封装ArrayList List<T> c = new Arra

独立开发,substack顶级编辑 937

高并发编程:并发容器

常见的容器如下图,我们会挑选高并发中常用的容器进行介绍。

weixin_55229531的博客 5万+

【Unity】Unity性能分析解决方案——UPR

由Unity中国团队提供的一套性能优化解决方案,其是一系列性能工具的集合,并可将收集的数据进行可视化。

Davidorzs的博客 1008

java多线程之并发容器集合

并发容器是Java 5 提供的在多线程编程下⽤于代替同步容器,针对不同的应⽤场景 进⾏设计,提⾼容器的并发访问性,同时定义了线程安全的复合操作,针对queue、List、Map、Set、Deque等,java.util.concurrent包提供了对应的并发集合类

程序员一博 669

实例讲解Simulink CAN通讯丢失故障判定模型搭建及仿真测试验证方法

本文通过ABS通讯丢失故障触发、判定条件Simulink模型的搭建和仿真的讲解,介绍了一种控制器CAN通讯丢失故障判定的方法和建模方法,希望能给相关技术人员带来一定参考和帮助。

qq_43011586的博客 3685

告别Link180!在Ansys Mechanical 2020R2中正确启用Cable280绳索单元(附Beta选项开启指南)

本文详细介绍了在Ansys Mechanical 2020R2中启用Cable280绳索单元的全过程,包括Beta选项的开启步骤、建模技巧及高阶应用。Cable280作为专为绳索仿真设计的单元,相比传统的Link180单元,在大变形模拟和计算效率上表现更优,特别适合斜拉桥、电梯牵引绳等工程场景。

weixin_33711647的博客 405

并发容器 介绍

并发容器:在Java并发编程中,经常听到Java集合类、同步容器、并发容器。它们之间具体的区别和优劣势介绍。在Java的集合框架中,主要分为四类:List、Set、Map、Queue。其中ArrayList、LinkedList、Hash Map都是。在多线程环境中使用。否则可能导致ConcurrentModificationException、元素丢失等。因此Java提供了供用户使用。同步容器:简单理解就是使用Synchronized来实现同步的容器。

yvya_的博客 981

【华为2021校招】笔试题【通用硬件】

时间:2020/07/15 19:00 时长:60min 题型:40单选+5多选 难度:中等 考察范围:模电、数电、SI、EMC、电源、微机原理、计算机网络、材料

Jkcia的博客 4万+

并发容器的原理,七大并发容器详解、及使用场景

并发容器的由来 在Java并发编程中,经常听到Java集合类,同步容器、并发容器,那么他们有哪些具体分类,以及各自之间的区别和优劣呢? 只有把这些梳理清楚了,你才能真正掌握在高并发的环境下,正确使用好并发容器,我们先从Java集合类,同步容器谈起。 1.什么是同步容器 Java的集合容器框架中,主要有四大类别:List、Set、Queue、Map,大家熟知的这些集合类ArrayList、Link...

JavaAQA的博客 1216

uniapp [全端兼容] - 实现接入集成高德地图搜索地址及选择位置功能,搜索框检索选择地点并返回经纬度及详细省市区县街道地址,用户搜索历史及清空历史记录,选择地址自动获取周边位置列表/地图移动选点

uni-app,高德地图,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,Uniapp高德地图,在地图上选择或搜索指定地点,打开地图选择位置,关联地址搜索,输入地址返回附近地址列表,uniApp高德地图地址搜索,搜索框历史记录,关键字搜索,周边查询,搜索位置,uniapp对接高德实现搜索出现地址以及保存搜索记录,集成高德地图,实现精准位置选点功能,获取当前定位城市,如何实现搜索功能,获取省份城市区街道详细地址经纬度,移动选点标记位置,在地图上进行选择位置选点、搜索

🏆 前端领域优质创作者 1万+

Python爬虫实战——如何自动爬取百度搜索结果页面

本文介绍了如何使用Python爬虫抓取百度搜索结果页面的内容,包括如何构建搜索URL、获取页面HTML、解析内容、处理翻页以及存储数据等。通过该教程,您可以轻松实现批量抓取百度搜索结果,并为后续的数据分析和处理打下基础。希望本文能为您在爬虫开发、数据分析等领域提供帮助。如果您在实际应用过程中遇到问题,可以参考反爬虫应对策略,并结合实际需求进行调整。

2201_76125261的博客 1711

Java并发—同步容器和并发容器

简述同步容器与并发容器   在Java并发编程中,经常听到同步容器、并发容器之说,那什么是同步容器与并发容器呢?同步容器可以简单地理解为通过synchronized来实现同步的容器,比如Vector、Hashtable以及SynchronizedList等容器,如果有多个线程调用同步容器的方法,它们将会串行执行。   可以通过查看Vector、Hashtable等同步容器的实现代码,...

aiganxie2129的博客 145

RK3588 部署 YOLO26 目标检测:PT → ONNX → RKNN 全流程

YOLO26n 在 RK3588 上 INT8 量化后 NPU 推理约 15ms,系统 FPS 约 55,可以覆盖边缘端实时检测需求。模型从 PT 到 RKNN 的转换要用opset=11避免算子兼容问题。先用 YOLO26n + 640 输入跑通全链路,确认推理结果正确后再做性能调优。

m0_64661770的博客 305

Java 并发集合容器

本文详细介绍了 Java 并发集合容器中的几个重要类,包括 `ConcurrentHashMap`、阻塞队列和 `CopyOnWrite` 容器。这些容器通过内部的同步机制实现了线程安全,简化了并发编程的复杂性。在实际开发中,根据具体的应用场景选择合适的并发容器,可以显著提高程序的性能和可维护性。

专注Java和MySQL领域知识分享 1131

C#解析基恩士(KEYENCE)PLC数据:KV协议通信与实时监控实现

KV协议是基恩士PLC使用的一种专用通信协议,通常用于与上位机进行数据交换。KV协议通过RS-232C、RS-485、Ethernet等接口与上位机通信,支持多种数据类型的读写,包括但不限于位、字、双字、浮点数等。简洁易用:KV协议的通信格式简单,易于实现。支持多种数据类型:支持位数据、字数据、定长字符串等。高效实时性:能够提供较高的实时数据交换性能,适合实时监控应用。本文介绍了如何通过C#与基恩士KV系列PLC进行通信,实现数据的解析和实时监控功能。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1806

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

从同步容器到并发容器

引言 容器是Java基础类库中使用频率最高的一部分,Java集合包中提供了大量的容器类来帮组我们简化开发,我前面的文章中对Java集合包中的关键容器进行过一个系列的分析,但这些集合类都是非线程安全的,即在多线程的环境下,都需要其他额外的手段来保证数据的正确性,最简单的就是通过synchronized关键字将所有使用到非线程安全的容器代码全部同步执行。这种方式虽然可以达到线程安全的目的,但存在几个...

Henry_Lin_Wind的博客 1255

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

同步容器与并发容器类简介

同步容器类   同步容器类包括Vector和HashTable,二者都是早期JDK的一部分,此外还包括在JDK1.2当中添加的一些功能相似的类,这些同步的封装类是由Collections.synchronizedXxx等工厂方法创建的。这些类实现线程安全的方式是:将它们的状态封装起来,并对每个公有方法都进行同步,使得每次都只有一个线程能够访问容器的状态。相较于并行容器,同步容器的实现原理其实很简...

寻光人cyh的博客 5957

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Java同步容器和并发容器

同步容器 在 Java 中,同步容器主要包括 2 类: Vector、Stack、HashTable Vector 实现了 List 接口,Vector 实际上就是一个数组,和 ArrayList 类似,但是 Vector 中的方法都是 synchronized 方法,即进行了同步措施。 Stack 也是一个同步容器,它的方法也用 synchronized 进行了同步,它实际上是继承于 ...

不喝枸杞的程序员 1835

java 并发容器_java并发:同步容器&并发容器

第一节同步容器、并发容器1.简述同步容器与并发容器在Java并发编程中,经常听到同步容器、并发容器之说,那什么是同步容器与并发容器呢?同步容器可以简单地理解为通过synchronized来实现同步的容器,比如Vector、Hashtable以及SynchronizedList等容器,如果有多个线程调用同步容器的方法,它们将会串行执行。可以通过查看Vector、Hashtable等同步容器的实现代码...

weixin_29663861的博客 222

并发容器详细介绍

并发容器是 Java 中用于在多线程环境下安全地存储和管理数据的集合类或数据结构。传统的集合类(如ArrayListHashMap等)在多线程环境下是不安全的,多个线程同时访问和修改它们时可能导致数据不一致或抛出异常。为了在并发环境下安全地使用集合,Java 提供了一些专门设计的并发容器,这些容器在内部实现了线程安全的机制,使得多个线程可以同时访问和操作而不会导致数据损坏或异常。高并发读取与写入:当应用程序需要在高并发场景下频繁读取和写入数据时,是一个理想的选择,如在缓存、计数器、共享数据的存储等场景中。

Flying_Fish_roe的博客 1131
上一篇: MYSQL锁机制以及优化建议
下一篇: 一篇文章搞懂线程池
Learning_foolish
博客等级 码龄9年 14粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值