多线程与高并发7-容器

NDVI空间分布变化Slope趋势分析与F检验(自用) 1.NDVI数据预处理2.一元线性回归分析3.Slope趋势分析与F检验 阅读详情

在这里插入图片描述
Queue队列:主要就是为高并发而存在,有进有出。
Deque双关队列:头和尾都可以存取
BlockingQueue阻塞队列:
PriorityQueue优先队列:按照顺序先入先出
DelayQueue延迟队列:队列中的对象只有到期之后才能被取走

HashTable,Vector

一代同步容器,所有的方法均上锁,基本不用

HashTable,HashMap,SynchroizedHashMap,ConcurrentHashMap

HashTable:JDK1.0时代,所有的方法都上了锁,性能较差
HashMap:效率高却无锁
SynchronizedHashMap:为解决HashMap无锁的问题,Collections工具类提供的转换方法。HashTable直接给方法上锁,这个是通过一个对象进行上锁效率稍高。

Collections.synchronizedMap(new HashMap<>);

ConcurrentHashMap:并发table
采用分段式锁设计,ConcurrentHashMap的主干是个Segment数组。Segment继承了ReentrantLock,所以它就是一种可重入锁(ReentrantLock)。
Segment里维护了一个HashEntry数组,并发环境下,对于不同Segment的数据进行操作是不用考虑锁竞争的。(就按默认的ConcurrentLeve为16来讲,理论上就允许16个线程并发执行,有木有很酷)
所以,对于同一个Segment的操作才需考虑线程同步,不同的Segment则无需考虑。
(put1.定位segment并确保定位的Segment已初始化 2.调用Segment的put方法。)
(get方法无需加锁,由于其中涉及到的共享变量都使用volatile修饰,volatile可以保证内存可见性,所以不会读取到过期数据。)

在写效率上来说,主要还是要看并发数和线程数,如果小并发情况下,sync式的map并不一定比ConcurrentHashMap低。(sync锁升级)。高并发情况下使用ConcurrentHashMap.
在读效率上,ConcurrentHashMap比HashTable和SyncTable效率高数十倍

ArrayList,Vector,Queue

ArrayList线程不安全,多个线程访问产生超卖现象
Vector线程安全,但所有的方法都上了锁
ConcurrentLinkedQueue在多线程条件下,如果没有不能重复线程,尽量使用Queue。queue提供了很多对多线程友好的api [ offer() peek() poll() ]
对于blockingqueue [ put() take() ]

Queue q = new ConcurrentLinkedQueue<>();
q.add();
q.poll();

ConcurrentHashMap,ConcurrentSkipListMap

非线程同步:hashMap,treeMap(红黑树排序,查询速度快)
线程同步:ConcurrentHashMap,ConcurrentSkipListMap(跳表,CAS实现于Tree太复杂,通过跳表实现。也是redis zset底层)
在这里插入图片描述
跳表结构,底层仍是链表(排序),选举出父节点,父节点们仍是链表结构(并行链表),如果元素较多再次选举。查询时,通过父节点之间的范围,最终获得到该节点。
效率要比链表快很多(O(n),O(logn))

CopyOnWriteArrayList,CopyOnWriteArraySet

应用:多线程并发,写操作少读操作多的情况。写的时候sync,通过Arrays.copyOf交换新增元素后的新数组。读时没有加锁(除新增元素,其他元素一模一样没必要加锁)
写时复制,在新增元素时,复制一个Array将元素放到最后的位置,然后指向新的地址。

BlockingQueue

LinkedBlockingQueue无界的 (不超过Integer.MAX_VALUE)
ArrayBlockingQueue有界的
DelayQueue在时间上排序
Synchronousqueue在两个线程间传递任务
Transferqueue以上q集合

Queue常用方法:

offer()添加元素,返回是否添加元素成功的返回值
peek()取出元素,并不会去掉元素
poll()取出元素,并且去掉元素

BlockingQueue常用方法(天生实现生产消费者):

put()放入元素,如果满了就会等待
take()取出元素,如无元素可取,将会阻塞

ArrayBlockingQueue

构造方法可以确定大小,到达阈值后:
put方法执行,将不会添加元素,并阻塞;
add方法执行,将抛出异常,full queue;
offer方法执行,不会添加元素,返回值false,构造方法可传入时间来尝试添加

DelayQueue

可根据时间进行执行任务,定时任务调度

PriorityQueue

不按照插入顺序取出,通过优先级排序,最小的先出

SynchronusQueue

容量为零,作用不是用来装载元素的,而是给其他线程下达任务的。

使用add()会异常,因为容量为0,不能够添加元素。只能使用put()进行阻塞操作,等待take()取走元素

TransferQueue

LinkedTransferQueue
transfer(“test”); 添加元素后,阻塞,等待取走元素。
场景:必须确定消费者取走元素。

ANSYS WORKBENCH——参数化建模以及参数优化(结果导出为Excel) 目录 1、打开软件workbench 2、找到static structure,双击打开 3、选择材料 4、参数化建模 ​ 注:印记面的创建 5、模型属性设置 注:设置优化目标 6、回主界面,选择direct optimization模块 1、打开软件workbench 2、找到static structure,双击打开 3、选择材料 4、参数化建模 至此参数化建模就已经完成啦 注:印记面的创建 印记面一般是一个虚拟的区域,参与实际的网格划分,但是只是由于载. 阅读详情

相关推荐

【从零开始玩量化1】AKShare: Python开源财经数据接口库

文章目录量化的第一步:数据AKShare介绍AKShare安装AKShare使用AKTools安装/使用结语 量化的第一步:数据 想要玩量化,第一步要有数据,这个数据可能是历史交易数据、财务数据、宏观数据等等。我们最终要做的,无非就是从数据中分析出有价值的信息,以便用来指导投资策略。 在获取数据的这条道路上,我走了很多弯路,尝试了各种方法:使用Tushare到放弃、自己写网易股票页面的爬虫,自己写申万行业数据的爬虫、自己写同花顺问财的爬虫、使用聚宽的免费数据API等等,直到最终,我发现了AKShare。 A

量化投资助手的博客 5万+

容器化时代如何调试容器内线程

容器化时代如何调试容器内线程 容器化时代服务都是运行在一个个权限较低的docker内部,当服务异常是很难在docker内执行gdb、perf等调试工具去进行运行时分析,此时我们需要登录到pod所在的node节点的宿主机上以root权限来进行调试。 安装nsenter yum install util-linux 什么是nsenter 一个最典型的用途就是进入容器的网络命令空间。相当多的容器为了轻量级,是不包含较为基础的命令的,比如说 ip address,ping,telnet,ss,tcp

csdnhyp的博客 458

DPO(Direct Preference Optimization)直接偏好优化

本文介绍了DPO(直接偏好优化)方法,该方法通过简化传统的RLHF(基于人类反馈的强化学习)流程,直接利用人类偏好数据进行模型优化。DPO的核心思想是跳过奖励模型训练和强化学习交互步骤,通过数学推导将优化目标转化为仅与策略概率分布相关的形式。推导表明最优策略与奖励模型之间存在显式关系,从而可以构建直接优化策略的损失函数。与RLHF相比,DPO简化了训练流程,提高了工程实现稳定性,同时保持了同等效果。

TeenLucifer的博客 1953

Java多线程之同步类容器与并发容器

同步容器类同步容器类包括Vector和HashTable,而且是早期JDK的一部分,这些同步的封装器类是由Collections.synchronizedxxx等工厂方法创建的。例如 Map<String,String> map =Collections.synchronizedMap(new HashMap<String,String >());HashMap本来不是线程安全的,但是上面的map

周周的Blog 1372

Huber损失函数中的阈值δ是如何确定的?

Huber损失函数通过阈值δ将误差划分为两部分:当误差小于等于δ时,采用平方损失(MSE),以保持对小误差的敏感性;当误差大于δ时,采用线性损失(MAE),以降低异常值对模型的影响。

百态·数智思维 | 聚焦大数据、量化与未来AI 1926

FRM(Financial Risk Manager,金融风险管理师)知识点总结归纳

FRM知识点总结(150字) FRM考试分为两级:一级侧重基础理论和工具,包含风险管理基础、定量分析、金融市场产品、估值与风险建模四大模块,涵盖风险管理框架、统计学方法、衍生品定价及VaR计算等核心内容。二级聚焦实际应用,分为市场风险、信用风险、操作风险、流动性风险、投资管理和市场前沿六大模块,深入探讨高级风险度量技术(如极值理论)、信用风险模型、巴塞尔协议及新兴风险议题。考试体系贯穿"风险识别→度量→管理→监管"逻辑主线,强调定量分析与实务案例的结合,覆盖传统金融风险和区块链、ESG等

极客神殿 1440

你都具备了吗?-百度T7专家耗时半年整理的电子版多线程与高并发原理

在读完市⾯上关于Java并发编程的资料后,感觉有些知识点不是很清晰,于是展开了对Java并发编程原理的讨论。鉴于开源精神,决定将我们讨论之后的Java并发编程原理整理成电子书籍,分享给⼤家。 站在巨⼈的肩上,我们可以看得更远。本文档内容的主要来源有博客、书籍、论⽂,对于⼀些已经叙述得很清晰的知识点我们直接引⽤在本书中;对于⼀些没有讲解清楚的知识点,我们加以画图或者编写Demo进⾏加⼯;⽽对于⼀些模棱两可的知识点,本文档在查阅了⼤量资料的情况下,给出最合理的解释。 这边文档的过程也是对⾃⼰研究和掌握的技术

weixin_47053906的博客 208

手把手教你用周立功USBCANFD-200U和ZCANPRO软件,从驱动安装到UDS诊断一条龙搞定

本文详细介绍了如何使用周立功USBCANFD-200U硬件和ZCANPRO软件,从驱动安装到UDS诊断的全流程操作指南。涵盖硬件连接、软件配置、CAN通信测试及UDS诊断实战,帮助汽车电子爱好者和工程师快速掌握CAN总线通信技术,实现专业的车辆诊断功能。

weixin_30752699的博客 578

JAVA并发容器-ConcurrentHashMap 解析

本文详细解析了ConcurrentHashMap在JDK1.7至JDK1.8版本间的实现原理,对比了其与HashMap和HashTable的异同,重点介绍了ConcurrentHashMap在不同版本中的数据结构、锁分段技术、扩容机制以及get、put等核心方法的实现细节。

xiaolyuh的专栏 818

GIS分析-利用K-Means方法进行地震分析

通过“聚类”可以获得有关我们所拥有的数据的各种线索,这是数据挖掘技术之一。分析创建的组有助于决策过程。在这项研究中,我们将使用数据挖掘工具之一的K-Means方法研究安纳托利亚东部地区近100年发生的地震的空间分布,并试图获得有用的信息,以供未来的研究使用。我从局地震目录页面获得了研究所需的地震数据,并从获得了区域边界数据。

gis收藏家的博客 1568

计组实验4 控制冒险与分支预测

目录前言实验内容背景知识分支预测技术⭐阻塞周期计算方法不开启 BTB开启 BTBpart 1 矩阵乘法与优化未开启 BTB 的分析开启 BTB 的分析part 2 设计代码使 BTB 无效part 3 循环展开优化矩阵乘法未开启 BTB开启 BTB结束语结论 前言 上一篇博客:计组实验3 mips冒险之流水线冒险 摸了半个月了。。。咕咕咕 今天来写计组实验 4 这个实验非常简单,就是有点难。 这个实验比较容易算错,或者是被模拟器出人意料的结果搞的神神叨叨的,所以今天来记录并且详细分析该实验。 注:请务必阅

AKGWSB 's blog 5666

告别ImageMagick卡顿!试试这个更快的图片处理神器GraphicsMagick,附CentOS 7保姆级安装教程

本文详细介绍了GraphicsMagick作为高性能图片处理工具的优势,并提供了CentOS 7下的保姆级安装教程。通过性能对比和实际案例,展示了GM在速度、内存占用和并发处理上的显著优势,特别适合电商、社交媒体等大规模图片处理场景。文章包含完整的源码编译、系统配置和使用技巧,帮助开发者快速掌握这一高效工具。

weixin_26833503的博客 433

Kaggle | 总奖池超200万美金的数学竞赛AIMO2冠军方案

••••结论1:通过结合高质量大规模数据集、工具集成推理和生成式选择方法,可以构建在挑战性数学问题上达到最先进水平的语言模型。本文的方法在 AIMO-2 竞赛中的胜利以及在多个数学基准上的 SOTA 结果验证了这一策略的有效性。结论2:发布 OpenMathReasoning 数据集、OpenMath-Nemotron 模型和代码是社区的宝贵财富。

hxshine的博客 1194

ConcurrentHashMap核心技术演进:从分段锁到synchronized+CAS的架构革命

在多核处理器成为标准配置的今天,高并发性能优化已成为Java开发者的核心技能。作为Java并发包中最重要、使用最频繁的容器之一,其架构设计经历了从保守到激进、从粗粒度到细粒度的演进过程。本文将带你深入理解这一技术演进背后的设计哲学和实现细节。从分段锁到synchronized+CAS的演进,不仅仅是技术的升级,更是并发编程思想的成熟。没有银弹:不同的并发模型适用于不同的场景权衡的艺术:在安全性、性能、复杂度之间找到平衡持续演进:随着硬件发展和需求变化,技术需要不断进化理解本质。

用文字记录技术,用分享回馈社区,用坚持见证成长 774

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

naive-ui 面板分割组件 NSplit 完全指南:布局、拖拽与受控尺寸

naive-ui 自 `2.36.0` 起提供了 `Split`(面板分割)组件,它是一种灵活的布局工具,通过可拖拽的分割条将区域一分为二,赋予用户自定义界面布局的能力。本文将以 [Split 官方演示文档](https://link.gitcode.com/i/7b14fa23ef6e3055370dfee7d4d58b29) 为核心骨架,结合组件源码、样式与测试用例,系统讲解 `NSplit`

gitblog_00066的博客 425

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

java 多线程(四)—— 线程同步/互斥

同步就是多个线程同时访问一个资源。那么如何实现?队列+锁。想要访问同一资源的线程排成一个队列,按照排队的顺序访问。访问的时候加上一个锁(参考卫生巾排队+锁门),访问完释放锁。

qq_44886213的博客 2325

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

多线程与高并发编程(六)【容器】

多线程容器一、容器补充知识(主要从多线程的使用角度上讲)1. 在物理结构上实际上容器只有两种:数组Array,链表Linked2. 在逻辑结构上的容器非常多。3. Collection一共三种List、Set、Queue(多线程最重要的)4. 容器发展过程 1)从HashTable到CHM 2)从Vector到Queue 3)sync与cas二、多线程容器1. ConcurrentHashMap(...

qq_36268025的博客 353

全网最全的 Java 多线程与高并发实战体系化学习资料

多线程与高并发是Java开发的核心竞争力,需通过体系化学习+大量实战掌握。线程安全基础(synchronized、volatile、原子类)。线程池调优与并发工具(CountDownLatch、Semaphore)。分布式场景(分布式锁、限流、最终一致性)。实战项目(秒杀系统、分布式ID生成器)。结合本文资源,可逐步构建从理论到实战的完整知识体系,应对面试与实际开发挑战。每学一个知识点,编写对应代码示例(如线程池参数调优实验)。复现经典项目(秒杀系统、分布式ID生成器)。分阶段突破。

一叶之秋的博客 2561

Java高并发容器

1. 高并发容器脑图 我们之前就学习了Collection下面的List和Set两大类,Queue是后来(1.5)加入的接口,它专门就是为高并发准备的 2. 从Hashtable到CHM Hashtable之前说过,与Vector一样,是Map的一个古老的实现类,它的设计有不太合理的地方,比如:每一个方法都加了Synchronized。因为大多数的程序都是单个线程在跑;之后java的开发人员意识到了这一点,于是添加了一个HashMap,HashMap不只是把Synchronized去掉,它还把其他的

weixin_45791318的博客 583

扫地神僧:Java开发者如何应对多线程与高并发面试题目?

发某粉丝年前参加某个NB企业的面试题列表: 聊聊synchronized的CPU原语级别实现 有一千万个数,写一个程序进行高效求和 已知2开平方为1.414,如何不用数学库,求开平方的值,精确到小数点儿后面10位 编码实现两个线程,线程A不断打印1-10的数字,要求在打印到第五个数字的时候通知线程B 自定义线程池需要指定哪7个参数,为什么不建议使用JUC内置线程池? 高并发、任务执行时...

JavaAOE的博客 836

多线程高并发学习之并发容器

多线程高并发学习之并发容器 HashMap相关的同步容器 前世今生介绍:HashMap是从HashTable演变过来的,HashTable设计之初的意愿是容器的的所有方法必须都得是同步的,所以HashTable的所有方法都是加了synchronized关键字来保证同步,这显然是不太合理的,因为大多数情况下,都是只有一个线程来操作容器,所以又在HashTable之后推出了HashMap HashTable——>全锁操作 HashMap——>无锁操作 ConcurrentHashMap——&gt

qq_42280920的博客 172

java 高并发容器_高并发编程系列:并发容器的原理,7大并发容器详解、及使用场景...

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

weixin_42465332的博客 210

高并发编程系列:并发容器的原理,7大并发容器详解、及使用场景

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

Javaesandyou的博客 486

骨灰级扫地神僧出版的《多线程与高并发》,2020你值得拥有

某粉丝年前参加某个NB企业的面试题列表: 聊聊synchronized的CPU原语级别实现 有一千万个数,写一个程序进行高效求和 已知2开平方为1.414,如何不用数学库,求开平方的值,精确到小数点儿后面10位 编码实现两个线程,线程A不断打印1-10的数字,要求在打印到第五个数字的时候通知线程B 自定义线程池需要指定哪7个参数,为什么不建议使用JUC内置线程池? 高并发、任务执行时间短的业务怎样使用线程池? 并发不高、任务执行时间长的业务

lingqu+wx bjmsb06 646

多线程与高并发(四) - 容器

java 容器 map Queue

阿昊的博客 1183

java 高并发容器_Java并发容器的原理:7大并发容器详解、及使用场景

之前谈过高并发编程系列:今天详细介绍并发容器的实现原理,与同步容器的区别等。并发容器的由来在Java并发编程中,经常听到Java集合类,同步容器、并发容器,那么他们有哪些具体分类,以及各自之间的区别和优劣呢?只有把这些梳理清楚了,你才能真正掌握在高并发的环境下,正确使用好并发容器,我们先从Java集合类,同步容器谈起。1.什么是同步容器Java的集合容器框架中,主要有四大类别:List、Set、Q...

weixin_33973572的博客 309
上一篇: 多线程与高并发6-ThreadLocal+强软弱虚
下一篇: 多线程与高并发8-线程池1
tgn123456
博客等级 码龄7年 28粉丝 142原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值