当前位置: 首页 > news >正文

有关List的线程安全、高效读取:不变模式下的CopyOnWriteArrayList类、数据共享通道:BlockingQueue


有关List的线程安全

队列、链表之类的数据结构也是极常用的,几乎所有的应用程序都会与之相关。在java中,
ArrayList和Vector都使用数组作为其内部实现。两者最大的不同在与Vector是线程安全的。
而ArrayList不是。此外LinkedList使用链表的数据结构实现了List。但是LinkedList并
不是线程安全的。参考对HashMap的包装,这里我们也可用用Collections.synchronizedList
方法来包装任意List:
public static List<String> l = Collections.synchronizedList(new LinkedList<String>());
此时生成的List对象就是线程安全的了。

ConcurrentLinkedQueue来实现高并非的队列。应该算是高并发环境中性能最好的队列。
它之所以很好性能,是因为其内部复杂的实现。这个方法没有任何锁操作。
线程安全完全由CAS操作和队列的算法来保证。整个方法的核心是for循环。
这个循环没有出口,直到尝试成功。这也符合CAS操作的流程。

高效读取:不变模式下的CopyOnWriteArrayList类

在很多应用场景中,读操作可能会远远大于写操作。
比如,有些系统级别的信息,往往只需要加载或者修改很少的次数,但是
会被系统内所有模块频繁访问。
由于读操作根本不会修改原有的数据,因此对于每次读取都进行加锁其实是一种
资源浪费。JDK中提供了CopyOnWriteArrayList类,对它来说,读取是完全不用
加锁的,并且更好的消息是,写入也不会阻塞读取操作。只有写入和写入之间需要
进行同步等待。

数据共享通道:BlockingQueue
前面提到了ConcurrentLinkedQueue类是高性能的队列。对于并发程序而言,
高性能自然是一个我们需要追求的目标,但多线程开发模式还会引入一个问题,
那就是如何进行多个线程间的数据共享呢?比如,线程A希望给线程B发一条消息
用什么方式告知线程B是比较合理的呢?
一般来说,我们总希望整个系统是松散耦合的。
比如,你所在小区的物业希望可用得到一些业主的意见,设立一个
意见箱,如果对物业有任何要求或意见都可用投到意见箱里。
如果对物业有任务要求或者意见都可用投到意见箱里。
作为业主的你并不需要直接找到物业相关的工作人员
就能表达意见。实际上,物业的工作人员也可能经常发生变动。
直接找工作人员未必是一件方便的事情。而你投递到意见箱的意见总是
会被物业的工作人员看到,不管是否发生了人员的变动。
这样你就可用很容易地表达自己的诉求了。
你既不需要直接和他们对话,又可用轻松提出自己的建议。

将这个模式映射到我们程序中,就是说我们既希望线程A能够通知线程B,
又希望线程A不知道线程B的存在。这样,如果将来进行重构或者升级,
我们完全可用不修改线程A,而直接把线程B升级为线程B,
保证系统的平滑过度。而这中间的意见箱就可用使用BlockingQueue来实现。

与之前提到的ConcurrentLinkedQueue类或者CopyOnWriteArrayList类不同,
BlockingQueue是一个接口,并非一个具体的实现。
ArrayBlockingQueue类和LinkedBlockingQueue类。
ArrayBlockingQueue更适合做有界队列,
LinkedBlockingQueue适合做无界队列。
BlockingQueue之所以适合作为数据共享的通道,其关键在于
Blocking上,Blocking是阻塞的意思,但服务线程(服务线程指
不断获取队列中的消息,进行处理的线程)处理完成队列中所有的消息后,
它如何知道下一条消息何时到来呢?
一种简单的做法是让这个线程按照一定的时间间隔不停地循环和监控这个队列。
这是一种可行的方案,但显然造成了不必要的资源浪费。
而且循环周期也难以确定。
BlockingQueue很好地解决了这个问题。它会让服务线程在队列为空时
进行等待,当有新的消息进入队列后,自动将线程唤醒。

相关文章:

有关List的线程安全、高效读取:不变模式下的CopyOnWriteArrayList类、数据共享通道:BlockingQueue

有关List的线程安全 队列、链表之类的数据结构也是极常用的&#xff0c;几乎所有的应用程序都会与之相关。在java中&#xff0c; ArrayList和Vector都使用数组作为其内部实现。两者最大的不同在与Vector是线程安全的。 而ArrayList不是。此外LinkedList使用链表的数据结构实现…...

OCC服务器和BCC服务器中文件同步

OCC服务器到BCC服务器文件正向同步 需求&#xff1a;编写shell脚本&#xff0c;使用rsync命令来同步目录&#xff0c;把全部需要同步的目录放在配置文件中&#xff0c;设置定时任务自动同步 服务器IP&#xff1a; 服务器类型IP地址OCC服务器192.168.1.188BCC服务器192.168.1…...

工具系列:TimeGPT_(2)使用外生变量时间序列预测

文章目录 TimeGPT使用外生变量时间序列预测导入相关工具包预测欧美国家次日电力价格案例 TimeGPT使用外生变量时间序列预测 外生变量在时间序列预测中非常重要&#xff0c;因为它们提供了可能影响预测的额外信息。这些变量可以包括假日标记、营销支出、天气数据或与你正在预测…...

应用于前端的自然断点法:wasm应用示例

某月某日&#xff0c;虾神本虾接到了这样一个需求&#xff0c;前端获取数据之后&#xff0c;在渲染之前&#xff0c;要对数据进行分类&#xff0c;分类的方法可以选择常用几种&#xff0c;例如等距法、自然断点法、标准差分类法等…… 问&#xff1a;为什么要在前端&#xff1…...

web前端javaScript笔记——(6)数组

对象一般分为内建对象&#xff0c;宿主对象&#xff0c;自定义对象。 数组(Array) 数组也是一个对象 它和我们普通对象功能类似&#xff0c;也是用来存储一些值的 不同的是普通对象是使用字符串作为属性名的&#xff0c;而数组时使用数字来作为索引操作元素案引: 从0开始的…...

vue的props

Vue的props是组件之间传递数据的一种方式&#xff0c;可以在组件中定义props并接收外部传递的数据。 在父组件中使用子组件时&#xff0c;可以使用v-bind指令将数据传递给子组件的props。子组件中可以通过props属性接收并使用这些数据。 父组件中&#xff1a; <template&…...

【51单片机系列】DS18B20温度传感器模块

本文是关于温度传感器的相关内容。 文章目录 一、 DS18B20数字温度传感器介绍1.1、 DS18B20温度传感器的特点1.2、DA18B20内部结构1.3、 DS18B20的温度转换规则1.4、 DS18B20的ROM指令表1.6、 计算温度1.7、 读写时序 二、DS18B20使用示例 一、 DS18B20数字温度传感器介绍 DS1…...

ubuntu20.04 conda环境配置Mask2former记录

建议先看完再按照步骤安装 代码地址&#xff1a;GitHub - facebookresearch/Mask2Former: Code release for "Masked-attention Mask Transformer for Universal Image Segmentation" 一、配置环境 1、创建虚拟环境 conda create -n mask2former python3.8conda …...

Git更新远程分支

当本地仓库无法找到新创建的远程分支时使用。 git fetch 是 Git 中的一个命令&#xff0c;用于从远程仓库获取最新的更改。 git fetch 会从指定的远程仓库中获取所有分支的最新提交&#xff0c;并将这些提交存储在本地的远程分支中。但是&#xff0c;这些更改并不会自动合并到…...

2023年软件工程师工作总结范文

各位领导&#xff1a; 你们好&#xff01;时光飞逝&#xff0c;光阴似箭&#xff0c;转眼间又到了一年的年末。2023年又是一个不平凡的年&#xff0c;今年是国家十四个五年计划的第三年&#xff0c;是全面贯彻党的二十大精神的开局之年。中国XX集团作为中国XX行业中最大的企…...

STM32实战之深入理解I²C通信协议

目录 IC的物理层 IC的协议层 IC特点 IC 总线时序图 软件模拟IC时序分享 软件模拟IIC驱动AT24C02分享 例程简介 例程分享 STM32的IC外设 IIC&#xff08;Inter-Integrated Circuit&#xff09;&#xff0c;也称为IC或TWI&#xff08;Two-Wire Interface&#xff09;&am…...

如何区分ChatGPT 3.5与ChatGPT 4:洞悉智能对话的新时代

如何区分ChatGPT 3.5与ChatGPT 4&#xff1a;洞悉智能对话的新时代 随着人工智能技术的快速发展&#xff0c;OpenAI持续推出更加强大和精准的模型&#xff0c;以改善和扩展用户体验。在聊天机器人领域&#xff0c;特别是OpenAI的ChatGPT系列&#xff0c;每一次迭代都带来了显著…...

blender scripting 编写

blender scripting 编写 一、查看ui按钮对应的代码二、查看或修改对象名称三、案例&#xff1a;渲染多张图片并导出对应的相机参数 一、查看ui按钮对应的代码 二、查看或修改对象名称 三、案例&#xff1a;渲染多张图片并导出对应的相机参数 注&#xff1a;通过ui交互都设置好…...

使用 Elasticsearch 检测抄袭 (二)

我在在之前的文章 “使用 Elasticsearch 检测抄袭 &#xff08;一&#xff09;” 介绍了如何检文章抄袭。这个在许多的实际使用中非常有意义。我在 CSDN 上的文章也经常被人引用或者抄袭。有的人甚至也不用指明出处。这对文章的作者来说是很不公平的。文章介绍的内容针对很多的…...

WPF DataGrid

文章目录 SelectionModeHeaderVisibilityBorderBrush SelectionMode DataGrid 控件的 SelectionMode 属性定义了用户可以如何选择 DataGrid 中的行。它是一个枚举类型的属性&#xff0c;有以下几个选项&#xff1a; Single&#xff08;默认值&#xff09;&#xff1a;只能选择…...

【cesium-5】鼠标交互与数据查询

scene.pick返回的是包含给定窗口位置基元的对象 scene.drillpack返回的是给定窗口位置所有对象的列表 Globe.pick返回的是给光线和地形的交点 Cesium.ScreenSpaceEventType.MIDDLE_CLICK 鼠标中间点击事件 Cesium.ScreenSpaceEventType.MOUSE_MOVE 鼠标移入事件 Cesium.ScreenS…...

Xcode 编译速度慢是什么原因?如何提高编译速度?

作为一个开发者&#xff0c;我们都希望能够高效地开发应用程序&#xff0c;而编译速度是影响开发效率的重要因素之一。然而&#xff0c;有时候我们会发现在使用 Xcode 进行开发时&#xff0c;译速度非常慢&#xff0c;这给我们带来了不少困扰。那么&#xff0c;为什么 Xcode 的…...

Best Arm Identification in Batched Multi-armed Bandit Problems

Q: 这篇论文试图解决什么问题&#xff1f; A: 这篇论文试图解决在批量多臂老虎机问题中进行最佳臂识别&#xff08;BAI&#xff09;的挑战&#xff0c;其中必须成批地对臂进行抽样&#xff0c;因为代理等待反馈的时间有限。这种场景出现在许多现实世界的应用中&#xff0c;例如…...

Unity编辑器紫色

紫色原因是因为编辑器内跑了其他平台的shader兼容性导致的&#xff0c;需要动态的去修改shader&#xff0c;主要用到Unity的api : Shader.Find(shaderName); 具体的工具代码如下&#xff1a; using System.Collections; using System.Collections.Generic; using UnityEngine…...

冒泡排序(C语言)

void BubbleSort(int arr[], int len) {int i, j, temp;for (i 0; i < len; i){for (j len - 1; j > i; j--){if (arr[j] > arr[j 1]){temp arr[j];arr[j] arr[j 1];arr[j 1] temp;}}} } 优化&#xff1a; 设置标志位flag&#xff0c;如果发生了交换flag设置…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统&#xff0c;它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间&#xff0c;使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的&#xff0c;要在 …...

解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist

现象&#xff1a; android studio报错&#xff1a; [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决&#xff1a; 不要动CMakeLists.…...

毫米波雷达基础理论(3D+4D)

3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文&#xff1a; 一文入门汽车毫米波雷达基本原理 &#xff1a;https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...

手机平板能效生态设计指令EU 2023/1670标准解读

手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读&#xff0c;综合法规核心要求、最新修正及企业合规要点&#xff1a; 一、法规背景与目标 生效与强制时间 发布于2023年8月31日&#xff08;OJ公报&…...

Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成

一个面向 Java 开发者的 Sring-Ai 示例工程项目&#xff0c;该项目是一个 Spring AI 快速入门的样例工程项目&#xff0c;旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计&#xff0c;每个模块都专注于特定的功能领域&#xff0c;便于学习和…...