有关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很好地解决了这个问题。它会让服务线程在队列为空时
进行等待,当有新的消息进入队列后,自动将线程唤醒。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【VB测绘程序设计】案例4——简单的四则运算练习Select Case语句的使用(附源码)

【VB测绘程序设计】案例4——简单的四则运算练习(附源码) 文章目录 前言一、界面预览二、程序介绍总结前言 在新手学习VB程序设计中,四则运算是基础,通过设计的TexT、按钮、label等控件,定义变量,实现简单程序的编写,提高对VB程序的入门训练。 一、界面预览 二、程序介…

【MybatisPlus快速入门】(2)SpringBoot整合MybatisPlus 之 标准数据层开发 代码示例

目录 1 标准CRUD使用2 新增3 删除4 修改5 根据ID查询6 查询所有7 MyBatis-Plus CRUD总结 之前我们已学习MyBatisPlus在代码示例与MyBatisPlus的简介&#xff0c;在这一节中我们重点学习的是数据层标准的CRUD(增删改查)的实现与分页功能。代码比较多&#xff0c;我们一个个来学习…

【开源】基于JAVA语言的企业项目合同信息系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 合同审批模块2.3 合同签订模块2.4 合同预警模块2.5 数据可视化模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 合同审批表3.2.2 合同签订表3.2.3 合同预警表 四、系统展示五、核心代码5.1 查询合同…

九、W5100S/W5500+RP2040之MicroPython开发<HTTPOneNET示例>

文章目录 1. 前言2. 平台操作流程2.1 创建设备2.2 创建数据流模板 3. WIZnet以太网芯片4. 示例讲解以及使用4.1 程序流程图4.2 测试准备4.3 连接方式4.4 相关代码4.5 烧录验证 5. 注意事项6. 相关链接 1. 前言 在这个智能硬件和物联网时代&#xff0c;MicroPython和树莓派PICO正…

2023,测试开发人的年终总结

根据TesterHome社区发帖整理。从该年终总结可以看出当前测试行业&#xff0c;哪怕是测试开发也是竞争很厉害。作为测试同仁&#xff0c;不但要掌握功能测试、接口测试、性能测试&#xff0c;掌握各种工具使用&#xff0c;还得懂开发&#xff0c;懂Java/Python&#xff0c;懂VUE…

【零基础入门Docker】什么是Dockerfile Syntax

✍面向读者&#xff1a;所有人 ✍所属专栏&#xff1a;零基础入门Docker专栏https://blog.csdn.net/arthas777/category_12455882.html 目录 编写Dockerfile和Format的语法 2. MAINTAINER 3. RUN 4. ADD 6. ENTRYPOINT 7. CMD 8. EXPOSE 9. VOLUME 11. USER 12. ARG …

MySQL创建member表失败

最近在做一个项目&#xff0c;在台式机上可以跑通&#xff0c;也测试了各个已完成的接口&#xff0c;提交到了GitHub后想着用宿舍的电脑跑一下&#xff0c;在测试member表相关接口时就出错了。报了SQL语法错误&#xff0c;但SQL语句很简单&#xff0c;就根据手机号查询不至于出…

实习课知识整理4:点击某个商品如何跳转到并展示出商品详情页

项目情景&#xff1a;当我们点击某个商品时&#xff0c;我们需要查看商品的具体的信息并进行购买的操作 简单理解以下就是&#xff0c;当我们点击一个url链接时&#xff0c;该链接需要携带一个参数到后端&#xff0c;一般设为商品的Id&#xff0c;然后后端通过Id从数据库中查找…

NGUI基础-三大基础组件之Root组件

NGUI NGUI&#xff08;Next-Gen UI&#xff09;是一款用于Unity游戏引擎的UI插件&#xff0c;它提供了一套功能强大、灵活易用的界面开发工具。在NGUI中&#xff0c;Root&#xff08;根节点&#xff09;是一个重要的概念。 基础组件之Root Root是NGUI中的最高层级节点&#…

linux运行可执行文件,通过c语言调用java的main方法

前言&#xff1a;以前一直在做Android开发&#xff0c;在某本书上看过一句话“Android上面不只有App类的程序可以运行&#xff0c;能在linux下运行的程序&#xff0c;也可以在Android上面运行” 一.编写C语言部分代码 1.定义java.h头文件 #include <jni.h>#ifndef _JAV…

计算机网络概述(下)——“计算机网络”

各位CSDN的uu们你们好呀&#xff0c;今天继续计算机网络概述的学习&#xff0c;下面&#xff0c;让我们一起进入计算机网络概述的世界吧&#xff01;&#xff01;&#xff01; 计算机网络体系结构 数据传输流程 计算机网络性能指标 计算机网络体系结构 两个计算机系统必须高度…

大数据技术学习笔记(十一)—— Flume

目录 1 Flume 概述1.1 Flume 定义1.2 Flume 基础架构 2 Flume 安装3 Flume 入门案例3.1 监控端口数据3.2 实时监控单个追加文件3.3 实时监控目录下多个新文件3.4 实时监控目录下的多个追加文件 4 Flume 进阶4.1 Flume 事务4.2 Flume Agent 内部原理4.3 Flume 拓扑结构4.3.1 简单…