Kotlin读写分离CopyOnWriteArrayList
Kotlin读写分离CopyOnWriteArrayList
基于读写分离思想Copy-On-Write(COW)设计的线程安全ArrayList变体,读读共享、写写互斥、读写互斥、写读互斥。读时直接读,不用加锁同步,线程安全。写/删/修改数据时复制一个副本,在新的List副本中写/删/改操作,写/删/改操作完成后,再把副本替换成原来的List。一般情况可当做普通ArrayList使用,规避List常见的ConcurrentModificationException异常问题。

优点:适合读多写少的场景,线程安全,读时候无须加锁(因为内部实现已经线程同步)。读写时候不会被阻塞。
缺点:(1)内存占用问题。占用内存高。因为在写操作时候,会复制一条相同的List,相当于每次写操作都会产生两倍内存占用需求。
(2)数据一致性问题。CopyOnWriteArrayList只能保证数据的最终一致性,不能保证实时一致性。
(3)数写速度问题。读时候快,写/删/改慢。
用普通ArrayList,多线程环境下抛错ConcurrentModificationException:
import java.util.Collections
import java.util.concurrent.Executorsfun main() {val nThreads = 200val mExecutorService = Executors.newFixedThreadPool(nThreads)var NUM = 0var list = Collections.synchronizedList(ArrayList<Int>())for (i in 1..nThreads) {mExecutorService.execute {while (true) {Thread.sleep(10)list.add(NUM++)println("@tid:${Thread.currentThread().threadId()}")list.forEachIndexed { index, j ->//println("${list}")}}}}mExecutorService.shutdown()
}

改用CopyOnWriteArrayList,运行正常:
import java.util.concurrent.CopyOnWriteArrayList
import java.util.concurrent.Executorsfun main() {val nThreads = 200val mExecutorService = Executors.newFixedThreadPool(nThreads)var NUM = 0var list = CopyOnWriteArrayList<Int>()for (i in 1..nThreads) {mExecutorService.execute {while (true) {Thread.sleep(10)list.add(NUM++)println("@tid:${Thread.currentThread().threadId()}")list.forEachIndexed { index, j ->//println("${list}")}}}}mExecutorService.shutdown()
}
避免了多线程环境读写ArrayList不安全的操作。
Java线程同步可重入锁ReentrantLock与Condition_zhangphil的博客-CSDN博客import java.util.LinkedList;import java.util.Queue;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.ReentrantLock;public class Main { private Queue...https://blog.csdn.net/zhangphil/article/details/92814997Java线程同步锁ReentrantLock和Condition中断等待程序前提条件满足_zhangphil的博客-CSDN博客import java.util.concurrent.TimeUnit;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.ReentrantLock;/** * ReentrantLock的lock和unlock必须成对使用且把需要同步的代码块包裹起来。 * lock-unlo...
https://blog.csdn.net/zhangphil/article/details/92826986Java线程同步与阻塞ReentrantLock - Condition替换wait - notify_reentrantlock和wait notify_zhangphil的博客-CSDN博客import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.ReentrantLock;public class Main { private ReentrantLock lock = new ReentrantLock(false); private Condition con..._reentrantlock和wait notify
https://blog.csdn.net/zhangphil/article/details/96360104ReentrantLock替换synchronized解决多线程并发死锁,Java_reentrantlock解决死锁问题的代码_zhangphil的博客-CSDN博客Java并发多线程环境中,造成死锁的最简单的场景是:多线程中的一个线程T_A持有锁L1并且申请试图获得锁L2,而多线程中另外一个线程T_B持有锁L2并且试图申请获得锁L1。线程的锁申请操作是阻塞的,于是造成线程T_A和线程T_B无法正确获得想要的锁,两个线程被阻塞进入死锁状态。Java线程同步锁ReentrantLock和Condition中断等待程序前提条件满足_zhangphil的博客-CSDN博客。_reentrantlock解决死锁问题的代码
https://blog.csdn.net/zhangphil/article/details/127548507Semaphore替换多线程synchronized解决并发环境死锁,Java_semaphore会照成死锁吗_zhangphil的博客-CSDN博客新Java线程Semaphore:并行环境下访问竞争资源控制Semaphore是从Java 1.5引入的Java线程新内容。Java并发多线程环境中,造成死锁的最简单的场景是:多线程中的一个线程T_A持有锁L1并且申请试图获得锁L2,而多线程中另外一个线程T_B持有锁L2并且试图申请获得锁L1。线程的锁申请操作是阻塞的,于是造成线程T_A和线程T_B无法正确获得想要的锁,两个线程被阻塞进入死锁状态。新Java线程Semaphore:并行环境下访问竞争资源控制_zhangphil的博客-CSDN博客。_semaphore会照成死锁吗
https://blog.csdn.net/zhangphil/article/details/127547504新Java线程Semaphore:并行环境下访问竞争资源控制_zhangphil的博客-CSDN博客新Java线程Semaphore:并行环境下访问竞争资源控制Semaphore是从Java 1.5引入的Java线程新内容。Semaphore实现在线程的竞争资源访问环境下,对资源的访问控制。只有申请(acquire)得到Semaphore的许可证的线程任务可以访问竞争资源。例如: private void test() { // 虽然有很多线程想访问某些资源,但...
https://blog.csdn.net/zhangphil/article/details/83410270
Java线程池:ExecutorService,Executors_executorservice线程池_zhangphil的博客-CSDN博客简单的Java线程池可以从Executors.newFixedThreadPool( int n)获得。此方法返回一个线程容量为n的线程池。然后ExecutorService的execute执行之。现给出一个示例。package zhangphil.executorservice;import java.util.concurrent.ExecutorService;import j_executorservice线程池https://blog.csdn.net/zhangphil/article/details/43898637
相关文章:
Kotlin读写分离CopyOnWriteArrayList
Kotlin读写分离CopyOnWriteArrayList 基于读写分离思想Copy-On-Write(COW)设计的线程安全ArrayList变体,读读共享、写写互斥、读写互斥、写读互斥。读时直接读,不用加锁同步,线程安全。写/删/修改数据时复制一个副本,在新的List副…...
centos自动同步北京时间
1、安装ntpdate服务 yum -y install ntpdate 2、加入自动任务计划 查找ntpdate的路径: which ntpdate 复制这个路径。 编辑自动任务计划并加入ntpdate: crontab -e # 每小时第30分钟同步AD域控时间 30 * * * * /usr/sbin/ntpdate -u 192.168.2.8 > …...
element-ui表格跨页多选实现
前言 在我们日常项目开发中,经常会有表格跨页多选的需求,接下来让我们用 el-table 示例一步步来实现这个需求。 动手开发 在线体验 https://codesandbox.io/s/priceless-mcclintock-4cp7x3?file/src/App.vue 常规版本 本部分只写了一些重点代码,心急的彦祖可以直接看 性…...
线性代数(三) 线性方程组向量空间
前言 如何利用行列式,矩阵求解线性方程组。 线性方程组的相关概念 用矩阵方程表示 齐次线性方程组:Ax0;非齐次线性方程组:Axb. 可以理解 齐次线性方程组 是特殊的 非齐次线性方程组 如何判断线性方程组的解 其中R(A)表示矩阵A的…...
学习跨度级交互以提取方面情感三元组
方面情感三元组 方面情感三元组(Aspect Sentiment Triplet)是一种在情感分析中使用的结构,它包含三个部分:方面目标(Aspect Target)、情感(Sentiment)和对应的观点词(Op…...
那些年的Xposed开发经验记录
把之前写的Xposed相关文章合并到一块,方便查阅 目录 多进程App的Hook问题XposedHelper中的静态变量demo的AndroidManifest.xml的测试核心代码结论限制handleLoadPackage被单个进程多次执行的问题 多dex Hook问题为应用增加权限利用Xposed删除权限参考 Hook框架集锦…...
android studio内存分析之Memory profiler的使用
目录 Android Studio中内存分析工具Memory profiler的使用1. 打开Memory Profiler2. 工具使用3. 内存选项说明4. 内存性能分析器概览5. 内存计算方式6. 查看内存分配7. 捕获java/kotlin方式查看内存分配8. 堆转储文件导入和导出 内存性能分析器中的泄漏检测 Android Studio中内…...
Qt下载慢/无法下载解决方式
文章目录 一. Qt在线安装下载二. 安装方式 一. Qt在线安装下载 官网下载:https://www.qt.io/download清华源下载:https://mirrors.tuna.tsinghua.edu.cn/qt/official_releases/online_installers/ 二. 安装方式 进入下载好的目录 在目录栏输入CMD&…...
【UE4 RTS】04-Camera Pan
前言 本篇实现了CameraPawn的旋转功能。 效果 步骤 1. 打开项目设置,添加两个操作映射 2. 打开玩家控制器“RTS_PlayerController_BP”,新建一个浮点型变量,命名为“PanSpeed” 在事件图表中添加如下节点 此时运行游戏可以发现当鼠标移动…...
出现raise NotImplementedError报错
在学习《动手学深度学习》时,实现下面代码时,报出raise NotImplementedError错误。 import collections import torch from d2l import torch as d2l import math from torch import nnclass Seq2SeqEncoder(d2l.Encoder):def __init__(self,vocab_size,…...
第一百二十二天学习记录:C++提高:STL-vector容器(上)(黑马教学视频)
vector基本概念 功能: vector数据结构和数组非常相似,也称为单端数组 vector与普通数组区别: 不同之处在于数组是静态空间,而vector可以动态扩展 动态扩展: 并不是在原空间之后续接新的空间,而是找更大的内…...
《Linux从练气到飞升》No.11 初识操作系统
🕺作者: 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的…...
什么是 XSS 攻击?
概念 XSS 攻击指的是跨站脚本攻击,是一种代码注入攻击。攻击者通过在网站注入恶意脚本,使之在用户的浏览器上运行,从而盗取用户的信息如 cookie 等。 XSS 的本质是因为网站没有对恶意代码进行过滤,与正常的代码混合在一起了&…...
基于Spring Boot的招聘网站的设计与实现(Java+spring boot+MySQL)
获取源码或者论文请私信博主 演示视频: 基于Spring Boot的招聘网站的设计与实现(Javaspring bootMySQL) 使用技术: 前端:html css javascript jQuery ajax thymeleaf 微信小程序 后端:Java springboot框…...
中级课程——CSRF
文章目录 案例原理挖掘 案例 原理 挖掘 挖掘详情 首先就是对目标敏感部位进行抓包分析,比如修改信息、转账、添加信息等等。通常一个数据包HTTP请求头里边都会有一个Referer,这个需要特别去验证。比如放到Burpsuit Repeater里边去测试:去掉…...
面试热题(岛屿数量)
给你一个由 1(陆地)和 0(水)组成的的二维网格,请你计算网格中岛屿的数量。 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外,你可以假设该网格的四条边均…...
【WebRTC---源码篇】(二十四)GCC获取码率后的分配
RtpTransportControllerSend::PostUpdates 配置码率 GoogCcNetworkController::GetPacingRates pacing_factor_默认2.5。也就是说pacer发送报文的码率是探测码率的2.5倍。 PacerConfig GoogCcNetworkController::GetPacingRates(Timestamp at_time) const {// Pacing rate …...
数据可视化工具LightningChart .NET正式发布v10.5.1——拥有全新的3D新功能
LightningChart.NET完全由GPU加速,并且性能经过优化,可用于实时显示海量数据-超过10亿个数据点。 LightningChart包括广泛的2D,高级3D,Polar,Smith,3D饼/甜甜圈,地理地图和GIS图表以及适用于科学…...
AWS认证SAA-C03每日一题
本题库由云计算狂魔微信公众号分享。 【SAA-C03助理级解决方案架构师认证】A company has a multi-tier application that runs six front-end web servers in an Amazon EC2 Auto Scaling group in a single Availability Zone behind an Application Load Balancer(ALB).A …...
ASP.NET Core MVC -- 将视图添加到 ASP.NET Core MVC 应用
Index页 右键单击“视图”文件夹,然后单击“添加”>>“新文件夹”,并将文件夹命名为“HelloWorld”。 右键单击“Views/HelloWorld”文件夹,然后单击“添加”>“新项”。 在“添加新项 - MvcMovie”对话框中: 在右上…...
2026届必备的五大降重复率工具实测分析
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 人工智能论文工具正一步步重新塑造学术写作范式,当下主流平台整合自然语言处理和…...
STM32CubeMX 6.4+ 配置FreeRTOS+LWIP避坑实录(正点原子探索者V2 + LAN8720A)
STM32CubeMX 6.4高版本FreeRTOS与LWIP配置全攻略:从PHY复位到网络调试 最近在给正点原子探索者V2开发板移植FreeRTOSLWIP时,发现网上大部分教程都停留在CubeMX 5.x时代。当我用6.4版本按照老教程操作时,从时钟配置到PHY复位处处碰壁。经过三天…...
魔兽争霸III运行卡顿、画面变形?WarcraftHelper开源工具助你解决经典游戏兼容难题
魔兽争霸III运行卡顿、画面变形?WarcraftHelper开源工具助你解决经典游戏兼容难题 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 经典游戏…...
NPC逆变器开环仿真模型:适用于基础研究及多电平模型辨识算法验证,载波层叠调制与多种负载适应性探究
NPC逆变器开环MATLAB仿真模型 开环!开环!开环! 适合基础研究 载波层叠调制、电阻负载 根据情况可以添加阻感负载、LCL滤波等 适合不同多电平模型辨识算法验证、故障诊断等工作!最近在搞多电平逆变器的算法验证,发现开环…...
2026毕业论文降AI指南:deepseek免费降AI指令+降AI神器测评,有效降低AI率【建议收藏】
快过年了,毕业生们日子并不好过,最近私信里哀鸿遍野。 “学姐,我明明是自己写的,为什么查重报告显示AI率80%?” “救命,用了劣质降AI工具结果语句不通,导师直接退回了……” 这几年AI领域发展…...
【GUI-Agent】阶跃星辰 GUI-MCP 解读---()---执行层芭
起因是我想在搞一些操作windows进程的事情时,老是需要右键以管理员身份运行,感觉很麻烦。就研究了一下怎么提权,顺手瞄了一眼Windows下用户态权限分配,然后也是感谢《深入解析Windows操作系统》这本书给我偷令牌的灵感吧ÿ…...
Windows 11 系统下 Maven 3.9.0 一站式配置与开发环境集成指南
1. 为什么选择Maven 3.9.0? 如果你正在Windows 11上开发Java项目,Maven绝对是你不可或缺的得力助手。作为一个项目管理和构建工具,Maven能帮你自动下载依赖库、统一项目结构、管理构建生命周期。最新发布的3.9.0版本在性能上有显著提升&#…...
3分钟完成Windows与Office永久激活:KMS_VL_ALL_AIO完整指南
3分钟完成Windows与Office永久激活:KMS_VL_ALL_AIO完整指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统弹出激活提示而烦恼吗?或者Office软件突然变…...
Claude 长文档处理怎么做分块与上下文组织
很多开发者都知道 Claude 适合处理长文档。 但真正落到工程里,效果好不好,往往不取决于模型本身,而取决于你怎么组织输入。 说得更直接一点,长文档处理最常见的误区不是模型不够强,而是团队把一大堆原始材料直接塞进去…...
PyTorch学习率调度器调用顺序详解:从UserWarning到最佳实践
1. 为什么PyTorch会报这个UserWarning? 我第一次看到这个警告时也是一头雾水。控制台突然跳出红字提示"Detected call of lr_scheduler.step() before optimizer.step()",让我一度以为自己的训练代码写错了。后来查阅PyTorch文档才发现&#x…...
