【多线程开发 5】实践使用Lock和Condition
Lock和Condition
Lock
线程之间同步或者竞争都需要锁这类结构,一般我们都会用Object的wait和signal搭配synchronized关键字进行多线程开发,但是很多时候会造成死锁的现象,这是因为synchroniezd无法破坏死锁的产生条件,但是Lock接口的一些实现类可以帮助我们避免思索地产生。一般用的比较多的是ReentrantLock这个Lock接口的实现类。
ReentrantLock
很多时候ReentrantLock是为了替代synchronized情况下同意出现死锁的情况的。并且相比于synchroniezd还有以下几个优点
- 可中断
- 可以设置超时时间
- 可以设置为公平锁
- 支持多个条件变量
- 与 synchronized 一样,都支持可重入
比如笔者有使用过一些任务分配和执行工具,如果出现了一台机器/CPU出现了同一时间内分配了多个任务或者长时间没有分配任务,那么对于我们的业务来说就很危险,在这种情况下可以通过使用ReentrantLock帮助我们解决这种问题
public static void main(String[] args) throws ExecutionException, InterruptedException {/*** 我们是以任务为主体获取信息,如果是我们的资源主体拉取信息,则reentrantLock是可以工具是否是公平锁而且获得对资源的掌控权的* 如果是tryLock()方法,则只要一看到有所就会获取锁*/
/*** 资源有10个*/AtomicReference<Integer> resource = new AtomicReference<>(10);//锁final Lock reentrantLock = new ReentrantLock();
ExecutorService executorService = Executors.newFixedThreadPool(1);
List<TaskInfo> taskInfos = new ArrayList<>();for (int i = 0; i < 10; i++) {taskInfos.add(new TaskInfo().setTaskName("任务" + i).setId(1));}
List<CompletableFuture<String>> taskList = new ArrayList<>();List<TaskInfo> didntExecuteTaskList = new ArrayList<>();for (int i = 0; i < 100; i++) {int finalI = i;taskList.add(CompletableFuture.supplyAsync(() -> {reentrantLock.lock();TaskInfo taskInfo = taskInfos.get(finalI % 10).setId(finalI);boolean executable = resource.get() > 0;if (executable) {resource.getAndSet(resource.get() - 1);/*** 开始执行*/CompletableFuture.supplyAsync(() -> {try {Thread.sleep((long) (Math.random() * 100 % 2));} catch (InterruptedException e) {throw new RuntimeException(e);}/*** 执行完成*/resource.getAndSet(resource.get() + 1);return 1;});reentrantLock.unlock();} else {didntExecuteTaskList.add(taskInfo);}return "任务" + taskInfo.getTaskName() + "执行" + (executable ? "成功" : "失败");}, executorService));}
for (CompletableFuture<String> completableFuture : taskList) {System.out.println(completableFuture.get());}System.out.println("没有完成的任务有" + didntExecuteTaskList.stream().map(TaskInfo::getTaskName).collect(Collectors.toList()));}
此时有可能会发生死锁,如果出现一些任务长时间占用,那么我们可以通过ReentrantLock 的 lockInterruptibly() 方法及时进行打断,这种方式在synchronized情况下无法实现
Condition
Condition将Object监控器方法( wait , notify和notifyAll )分解为不同的对象,从而通过与任意Lock实现结合使用,从而使每个对象具有多个等待集。 Lock替换了synchronized方法和语句的使用,而Condition替换了Object监视器方法的使用。
Condition实例从本质上绑定到锁。 要获取特定Lock实例的Condition实例,请使用其newCondition()方法
如果说Lock是锁,只有拿到锁才能执行的话,Condition就是信号量,有了信号量才能执行后续的操作,Condition更像是线程之间的同步机制,如果说有多个线程之间需要相互进行条件制约的话,可以通过Condition进行开发业务。
有时候lock抢到了锁,可能发现不需要进行执行,所以的话还需要condition做更加细致的操作。
比如在Lock和Condition下实现的消息队列中,Lock保证消息队列线程安全,Condition保证业务需要,比如说不能消费空队列,或者往满队列中添加信息,这种方式在很多框架中都有使用
相关文章:
【多线程开发 5】实践使用Lock和Condition
Lock和Condition Lock 线程之间同步或者竞争都需要锁这类结构,一般我们都会用Object的wait和signal搭配synchronized关键字进行多线程开发,但是很多时候会造成死锁的现象,这是因为synchroniezd无法破坏死锁的产生条件,但是Lock接…...
2.4-结构化并发:协程的结构化异常管理
文章目录 协程结构化异常流程协程结构化异常流程和取消流程的区别子协程异常为什么要连带取消父协程? CoroutineExceptionHandler异常协程异常的最后一道拦截:CoroutineExceptionHandlerCoroutineExceptionHandler 为什么只能设置给最外层协程才有效&…...
Android 12.0 debug版本打开OEM解锁开关功能实现
通常为了方便push在debug版本会采用如下命令 adb root adb disable-verity 提示: Device is locked. Please unlock the device first. 查找日志可以发现system/core/set-verity-state/set-verity-state.cpp文件中is_avb_device_locked方法里 这个获取ro.boot…...
linux用户组练习
准备工作 [rootlocalhost ~]# watch -n 1 tail -n 5 /etc/group使用watch 动态监控 1.建立用户组 shengcan,其id 为2000 2.建立用户组 caiwu,其id 为 2001 3.足建立用户组 jishu,其id 为 2002 4.建立用户lee,指定其主组id为sh…...
[Docker][Docker Container]详细讲解
目录 1.什么是容器?2.容器命令1.docker creatre2.docker run3.docker ps4.docker logs5.docker attach6.docker exec7.docker start8.docker stop9.docker restart10.docker kill11.docker top12.docker stats13.docker container inspect14.docker port15.docker c…...
塑造美好心灵,激发创造活力|第三届瓷艺中华“陶溪川杯”儿童青少年陶瓷作品展开展
第三届瓷艺中华“陶溪川杯”儿童青少年陶瓷作品展 展览现场 由中央美术学院、景德镇陶瓷大学、景德镇陶文旅控股集团共同主办,由中国非物质文化遗产保护协会陶瓷分会、中国文化艺术发展促进会陶瓷专业委员会、中央美术学院陶瓷艺术研究院、中央美术学院少儿美术教…...
鸿蒙开发刷新单个item会闪一下处理
鸿蒙开发刷新单个item会闪一下 首先我用的是懒加载方式,改变某位数据后我调listener.onDataChange(index),发现item的改动是变了,但是item也闪了一下。 先分析为什么item会闪一下 其他是因为item上有图片,加载的网络图。你onDataChange(index)时,它会重新加载这一item,…...
您需要了解的有关 5G 的一切。
转载 https://www.qualcomm.com/5g/what-is-5g 在这里,您可以找到 5G 技术的解释——5G 的工作原理、5G 的重要性以及它如何改变世界连接和沟通的方式。在 Qualcomm,我们发明了使 5G 成为可能的根本性突破。 问:什么是 5G? 答&…...
【redis】初识redis入门,基础部署以及介绍
本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》:python零基础入门学习 《python运维脚本》: python运维脚本实践 《shell》:shell学习 《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战 《k8…...
数据库基础 -- 数据库约束
数据库基础 – 数据库约束 1.约束 1.1 概念 约束是用于强制数据库中数据 完整性 和 一致性 的规则。它们定义了对表中数据的限制,确保数据的有效性和正确性,实际上就是表中数据的限制条件。 1.2 分类 1.2.1 完整性约束 主键约束(Primary Key Const…...
U盘文件或目录损坏无法读取?专业恢复策略全解析
U盘困境:文件目录的隐形危机 在日常的数字生活中,U盘作为便捷的数据存储与传输工具,扮演着至关重要的角色。然而,当U盘中的文件或目录突然遭遇损坏,导致无法被正常读取时,这无疑给用户带来了极大的困扰。这…...
dpdk实现udp协议栈
使用DPDK实现UDP用户态协议栈,实现流程中包括: 三类线程 1、收发包线程 2、用户态协议栈线程 3、udp服务端线程 两类缓冲区: 1、协议栈收包缓冲区和协议栈发包缓冲区 2、udp收包缓冲区和udp发包缓冲区 协议栈缓冲区中存储的数据是str…...
Shell编程——基础语法(2)和 Shell流程控制
文章目录 基础语法(2)echo命令read命令printf命令test命令 Shell流程控制if-else语句for 循环while 语句until 循环case ... esac跳出循环 基础语法(2) echo命令 Shell 的 echo 指令与 PHP 的 echo 指令类似,都是用于…...
Python基础教程(二)字符串和函数
6.字符串 6.1 字符串的表示方式 6.1.1 普通字符串 普通字符串指用单引号()或双引号(”")括起来的字符串。例如:Hello或"Hello" >>> Hello Hello >>> "Hello" Hello >>> s\u0048\u0065\u006c\u006c\u006f >>> …...
智算新风向丨趋动科技获中国信通院泰尔实验室首张智算资源池化能力泰尔测评证书
近日,趋动科技“OrionX AI算力资源池化软件”经中国泰尔实验室依据《FG-Z14-0172-01智算资源池化平台测试方案》评估测试,获得智算资源池化能力泰尔测评证书,成为该领域首个完成此评价的产品。 图1.OrionX通过智算资源池化平台评测 随着AI大…...
计算机基础(Windows 10+Office 2016)教程 —— 第4章 计算机网络与Internet(上)
第4章 计算机网络与Internet 4.1 计算机网络概述4.1.1 计算机网络的定义4.1.2 计算机网络的发展4.1.3 计算机网络的功能4.1.4 计算机网络体系结构和TCP/IP 参考模型 4.2 计算机网络的组成和分类4.2.1 计算机网络的组成4.2.2 计算机网络的分类 4.3 网络传输介质和通信设备4.3.1 …...
MES系统在数字化转型中的核心作用与影响
数字化转型是企业利用数字技术改变其业务模式、运营方式、组织结构、产品服务等方面的过程,旨在提高效率、降低成本、增强竞争力并实现可持续发展。数字化转型涉及多个层面,主要包括以下几个方面: 数字化转型转什么 转战略:由构…...
装修施工注意事项
1 地漏保护 咋墙拆改时,一定要用保护盖把所有的地漏下水管道都拧紧 2 卫生间防水做完,必须要先用水泥砂浆做好保护层再贴,不然后续施工,不小心破坏防水层,以后漏水后悔都晚了。 3 入户门口处,一定要用…...
【Docker学习记录】
Docker学习记录 目录 1. Windows上使用wsl1.1 安装docker后遇到的一些疑惑1.2. wsl的一些相关命令1.3. 补一点,wsl的作用 2. docker一些常用的命令2.1 构建docker镜像2.2 运行镜像 3. Dockerfile的编写3.0 docker的一些概念3.0.1 容器的分层3.0.2 COPY-ON-WRITE 3.…...
互联网政务应用安全管理规定
互联网政务应用安全管理规定 (2024年2月19日中央网络安全和信息化委员会办公室、中央机构编制委员会办公室、工业和信息化部、公安部制定 2024年5月15日发布) 第一章 总则 第一条为保障互联网政务应用安全,根据《中华人民共和国网络安全法…...
WuliArt Qwen-Image Turbo详细步骤:LoRA权重目录结构说明与自定义挂载方法
WuliArt Qwen-Image Turbo详细步骤:LoRA权重目录结构说明与自定义挂载方法 1. 项目核心:为什么你需要了解LoRA权重 如果你已经体验过WuliArt Qwen-Image Turbo那“4步出图”的极速快感,可能会好奇:这个模型为什么能这么快&#…...
告别AI平台切换:Noi浏览器多模型协作功能让效率提升20倍的秘密
告别AI平台切换:Noi浏览器多模型协作功能让效率提升20倍的秘密 【免费下载链接】Noi 项目地址: https://gitcode.com/GitHub_Trending/no/Noi 当你需要对比三个AI平台对同一问题的回答时,是否还在重复着复制粘贴的机械操作?每次切换标…...
Granite TimeSeries FlowState R1多步预测效果展示:滚动预测与置信区间可视化
Granite TimeSeries FlowState R1多步预测效果展示:滚动预测与置信区间可视化 时间序列预测这事儿,听起来挺专业,但其实离我们很近。比如,你猜明天超市的牛奶会卖出去多少箱?下个月公司的电费大概是多少?或…...
零基础如何成为AI产品经理?从零到高薪!3步拿下字节跳动AI产品经理Offer,附大厂真实JD拆解
在AI浪潮席卷各行各业的今天,AI产品经理已成为最炙手可热的职业之一。据行业数据显示,2026年1-2月新发AI岗位量同比增长约12倍,AI产品经理平均月薪突破6万元,薪资普遍在30K-60K之间。本文将从岗位认知、技能要求、学习路径、招聘市…...
如何快速构建AI金融交易系统:TradingAgents-CN多智能体框架完整指南
如何快速构建AI金融交易系统:TradingAgents-CN多智能体框架完整指南 【免费下载链接】TradingAgents-CN 基于多智能体LLM的中文金融交易框架 - TradingAgents中文增强版 项目地址: https://gitcode.com/GitHub_Trending/tr/TradingAgents-CN TradingAgents-C…...
Porymap:让宝可梦地图编辑效率提升300%的跨平台工具
Porymap:让宝可梦地图编辑效率提升300%的跨平台工具 【免费下载链接】porymap Map editor for pokeemerald, pokefirered, and pokeruby 项目地址: https://gitcode.com/gh_mirrors/po/porymap 功能概述:重新定义宝可梦地图创作体验 作为专为第三…...
BitNet 1-bit大语言模型CPU端高效推理实战指南
BitNet 1-bit大语言模型CPU端高效推理实战指南 【免费下载链接】BitNet 1-bit LLM 高效推理框架,支持 CPU 端快速运行。 项目地址: https://gitcode.com/GitHub_Trending/bitne/BitNet BitNet 1-bit大语言模型推理框架是微软官方推出的革命性低比特推理解决方…...
Steam成就数据自主管理:技术深度解析与实战应用
Steam成就数据自主管理:技术深度解析与实战应用 【免费下载链接】SteamAchievementManager A manager for game achievements in Steam. 项目地址: https://gitcode.com/gh_mirrors/st/SteamAchievementManager 你是否曾因某个隐藏成就的触发条件过于苛刻而反…...
LightRAG深度解析:如何通过双级检索与图结构优化RAG系统性能?
1. LightRAG如何解决传统RAG的痛点 如果你用过传统的RAG(检索增强生成)系统,肯定遇到过这样的场景:明明数据库里有相关资料,但系统就是找不到关键信息;或者检索结果虽然相关,但缺乏上下文关联性…...
Stable Yogi Leather-Dress-Collection实战:基于SpringBoot的智能客服系统集成
Stable Yogi Leather-Dress-Collection实战:基于SpringBoot的智能客服系统集成 最近和几个做电商的朋友聊天,他们都在头疼一件事:客服成本越来越高,用户咨询量一大,人工根本忙不过来,回复慢了还影响转化率…...
