java容器

news2024/11/19 8:23:10

cow容器

copy on write 又被成为写时复制(读写分离)容器,

原理就是:

        如果向一个数组中添加元素的时候,会将原来的数组复制一份为新的数组,原来的数组不会动,负责读处理,然后在新的数组中进行添加操作,添加完后,将新数组的地址,赋值给原来数组的地址

这种设计的好处是什么呢?

        注意上面的操作arr数组本身是无锁的,没有锁,在添加数据的时候,做了额外的复制,此时如果有线程来读数据,那么读取的是老arr的数据,此时arr的地址还没有改呢,在我添加元素的过程无论有多少个线程来读数据,都是读的原来的arr,不是新的arr所以性能很高,读写离,提高了并发的性能,如果再读再复制

注意:

        该容器只能保证最终一致性,因为必须等增加完后,才会赋值给新的地址,不能导致实时一致性

CopyOnWriteArrayList

(可以放重复的元素)

核心源码:

CopyOnWriteArraySet

不能放重复的数据,

其实底层就是调用的CopyOnWriteArrayList.addIfbsent()方法(如果不存在则添加,类似Redis中的nSet())方法,

每次在addIfAbsent方法中每次都要对数组进行遍历,所以opy0nWriteArraySet的性能低于Copy0nWriteArrayList

队列(Queue)

先进先出 实现了Collection接口 

BlockingQueue(阻塞队列)

继承了Queue接口



非阻塞队列:当队列满的时候,放入第11个元素,数据丢失

非阻塞队列:当队列中没有元素的时候,取数据,得到的是null

阻塞队列:当队列满的时候,放入第11个元素,等待,等待队列中有出队的元素,那么第11个元素再放进去

阻塞队列:当队列中没有元素的时候,取数据,等待,什么时候有元素入队,才可以取出

ArrayBlockingQueue

原理:不支持读写同时操作,底层是一个Object的数组,有两个池:notEmpty:放的是取的线程   noFull:放的是存的线程 

工作原理:有两个类似指针光标:putIndex  和 takeIndex  一个是放的时候的索引,一个是取的时候的索引,初始值都是0,当元素添加进来的时候,就把元素放到对应的"0"索引位置上,然后让pustIndex++  就变成了"1",下次再有元素来的时候,继续++,直到放不下了,放的指针就变成0位置,下一次放的时候又是放到了0的位置上,取的时候也是,先从"0"位置开始取,然后以此类推,直到取完.又回到0位置上,下一次取的时候,又是从0位置上开始取,就这样一直循环.

源码如下:

放元素和取元素,(阻塞的方法)

面试题:

上面的while不可以换为if,因为如果notFull中的线程被激活的瞬间,有其他线程放入元素,那么队列就又满了那么沿着await后面继续执行就不可以,所以一定要反复确定队列是否满的,才能放入元素

LinkedBlockingQueue

支持读写同时操作,并发情况下,效率高。底层基于链表

原理:有两把锁,一个是放的锁,一个是取的锁

 源码如下:

阻塞put方法:

SynchronousQueue

队列的长度为0

        工作原理:有两个线程从该队列中去取数据,但是这个队列必须先取,再放,相当于直接是两个线程之间直接进行传递数据.

PriorityBlockingQueue

带有优先级的阻塞队列。
优先级队列,意味着队列有先后顺序的,数据有不同的权重。
无界的队列,没有长度限制,但是在你不指定长度的时候,默认初始长度为11,也可以手动指定,当然随着数据不断的加入,底层(底层是数组Obiet)会自动扩容,直到内存全部消耗殆尽了,导致 OutOfMemorvEror内存溢出 程序才会结束
        不可以放入null元素的,不允许放入不可比较的对象(导致抛出ClassCastException),对象必须实现内部比较器或者外部比较器

这个优先级队列,并不是在put数据的时候计算谁在前谁在后而是取数据的时候,才真正判断谁在前 谁在后
优先级--》取数据的优先级

DelayQueue


        DelayQueue是一个无界的BlockingQueue,用于放置实现了Delayed接口的对象,其中的对象只能在其到期时才能从队列中取走
        当生产者线程调用put之类的方法加入元素时,会触发Delayed接口中的compareTo方法进行排序,也就是说队列中元素的顺序是按到期时间排序的,而非它们进入队列的顺序。排在队列头部的元素是最早到期的,越往后到期时间越晚。
        消费者线程查看队列头部的元素,注意是查看不是取出。然后调用元素的qetDelay方法,如果此方法返回的值小0或者等于0,则消费者线程会从队列中取出此元素,并进行处理。如果getDelay方法返回的值大于0,则消费者线程wait返回的时间值后,再从队列头部取出元素,此元素应该已经到期。

注意:不能将null元素放置到这种队列中。

要想使用该队列,必须重写这两个方法


DelayQueue能做什么
1.淘宝订单业务:下单之后如果三十分钟之内没有付款就自动取消订单
2.饿了吗订餐通知:下单成功后60s之后给用户发送短信通知。
3.关闭空闲连接。服务器中,有很多客户端的连接,空闲一段时间之后需要关闭之
4.缓存。缓存中的对象,超过了空闲时间,需要从缓存中移出。
5.任务超时处理。在网络协议滑动窗口请求应答式交互时,处理超时未响应的请求等。

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

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

相关文章

x86 汇编语言介绍001

1,搭建编程环境 1.1 NASM 基本信息 示例使用的汇编器为 nasm 主页: https://www.nasm.us/https://www.nasm.us/ 下载最新的稳定版源代码 wget https://www.nasm.us/pub/nasm/releasebuilds/2.16.01/nasm-2.16.01.tar.gz 1.2解压并编译安装 tar zx…

基于时隙的多重冗余流指纹模型

文章信息 论文题目:基于时隙的多重冗余流指纹模型 期刊(会议):网络与信息安全学报 时间:2023 级别:CCF C 概述 为确保内生网络流量安全可信,本文在研究流水印及其扩展的流指纹机制的基础上&a…

鸿蒙(HarmonyOS)应用开发——装饰器

简介 ArkTS是HarmonyOS优选的主力应用开发语言。它在TypeScript(简称TS)的基础上,扩展了声明式UI、状态管理等相应的能力,让开发者可以以更简洁、更自然的方式开发高性能应用。TS是JavaScript(简称JS)的超…

FIB表与快速转发表工作原理

在一张路由表中,当存在多个路由项可同时匹配目的IP地址时,路由查找进程会选择掩码最长的路由项用于转发,即最长匹配原则。因为掩码越长,所处的网段范围就越小,网段的范围越小,就越能快速的定位到PC机的具体…

2.Linux系统及常用命令

目录 一、Linux文件系统和目录 1.1 Linux文件系统 1.2Linux主要目录 二、Linux远程连接 2.1前置条件 2.2 具体远程操作 三、Linux的常用命令 3.1 Linux命令的格式 3.2 Linux命令的帮助信息查看 3.3 Linux文件操作常用命令 命令中快捷键 以管理员权限执行命令 3.3.1…

[网鼎杯 2020 青龙组]singal

一道VM题目 可以看到长度是15 跟踪调用read函数的函数 分析一下switch中每个指令的含义、 在scanf下面打断点 在关键跳转处下断点 打开Ponce插件 GitHub - illera88/Ponce: IDA 2016 plugin contest winner! Symbolic Execution just one-click away! 然后开始动调 输入15个…

【C4D如何将多个选集设置为一个选集】

操作 首先,单击一个选集,将选集中的面高亮显示 接着,按着shift,点击另一个选集,点击右侧命令栏中的选择,即可多选另外的面选集,更多的面选集是同样的操作,按着SHIFT选择新的选集即…

计算机中由于找不到vcruntime140.dll无法继续执行代码无法打开软件怎么解决分享

关于如何解决vcruntime140.dll无法继续执行代码的6个教程。在这个科技日新月异的时代,电脑已经是我们日常和工作中必不可少的电子产品,然后我们在使用过程中经常会遇到不一样的问题,比如vcruntime140.dll文件丢失,那么vcruntime14…

【 拓扑排序】

文章目录 拓扑排序AOV-网拓扑排序的方法拓扑排序的一个重要应用:拓扑排序的算法 拓扑排序 AOV-网 无环的有向图称作有向无环图。 这种用顶点表示活动,用弧表示活动间的优先关系的有向图称为以顶点为活动的网(Activity On Vertex Network&am…

电脑技巧:U盘运用小技巧,提升U盘运用寿命

目录 1、注意清洁,防止污染 2、别随意插拔 3、文件多时分段写入 4、U盘传输数据中切记拔掉U盘 5、建议不要长期将U盘插在电脑上 6、杜绝别频繁将U盘格式化 7、U盘中毒怎么办 U盘是大家日常办公经常用得到的便携式文件储存工具,因为其小巧便携、方…

基于vue+element-plus+echarts编写动态绘图页面

我们都知道网页的echarts可以画图,但是很多情况下都需要编码实现绘图逻辑,如果有一个前端页面可以让我输入数据然后动态生成图表的话那么该多好,其实这个需求不难实现,先看效果。 整体页面分为左右两个部分,其中左边的…

76. 最小覆盖子串 (滑动窗口)

Problem: 76. 最小覆盖子串 文章目录 思路相似滑动窗口题目 :Code 题目 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。 注意: 对于 t 中重复字符,我…

【尚跑】2023宝鸡马拉松安全完赛,顺利PB达成

1、赛事背景 千年宝地,一马当先!10月15日7时30分,吉利银河2023宝鸡马拉松在宝鸡市行政中心广场鸣枪开跑。 不可忽视的是,这次赛事的卓越之处不仅在于规模和参与人数,还在于其精心的策划和细致入微的组织。为了确保每位…

P13 C++ 类 | 结构体内部的静态static

目录 01 前言 02 类内部创建静态变量的例子 03 在类的内部创建静态变量的作用 04 最后的话 01 前言 本期我们讨论 static 在一个类或一个结构体中的具体情况。 在几乎所有面向对象的语言中,静态在一个类中意味着特定的东西。这意味着在类的所有实例中&#xff…

管理类联考——写作——考点+记忆篇——论证有效性分析——记忆

文章目录 论证有效性分析得分要点、寻找漏洞方法论证有效性分析五大逻辑漏洞类型论证有效性分析的具体写法论证有效性分析十大解题思路(上)方法一:理想法方法二:极端法方法三:其他因素法方法四:可行性法 论…

Vue打包错误UnhandledPromiseRejectionWarning: CssSyntaxError

错误详情如下: building for production...Error processing file: static/css/app.3d5caae7aaba719754d7d5c30b864551.css (node:33011) UnhandledPromiseRejectionWarning: CssSyntaxError: /Users/yt/Documents/BM/sims-plus/sims-website/static/css/app.3d5caa…

无人机电力巡检系统运行流程全解读

随着电力行业体系不断完善,保障电网运营的安全成为至关重要的任务。传统的人工巡检方式在面对电力设备广泛分布和复杂工况时显得效率低下,为了解决这一难题,无人机电力巡检系统应运而生,以智能化的运行流程,为电网安全…

超级应用平台的诞生

摘要:本文介绍了明道云的发展计划和商业模式。明道云将退出直营市场,专注于合作伙伴业务,提供更全面的支持,共同推动数字化能力的发展,实现业绩和终端客户收入的增长。文章强调了明道云与合作伙伴的紧密关系&#xff0…

文件批量改名方法:文件自动批量重命名,提升文件管理效率

在日常工作中随着工作时间的推移,在文件数量日益增长的情况下,会在电脑中积累大量的文件。如果文件名混乱无序,查找和识别重要文件将变得非常困难。这不仅会浪费大量的时间和精力,还可能导致重要文件的丢失或混乱。文件批量改名可…

已解决:Could not find a package configuration file provided by “gazebo_plugins“

问题出现在我使用catkin_make的时候 CMake Error at /home/hiuching-g/catkin_ws/devel/share/catkin/cmake/catkinConfig.cmake:83 (find_package):Could not find a package configuration file provided by "gazebo_plugins"with any of the following names:gaz…