【并发设计模式】聊聊等待唤醒机制的规范实现
在多线程编程中,其实就是分工、协作、互斥。在很多场景中,比如A执行的过程中需要同步等待另外一个线程处理的结果,这种方式下,就是一种等待唤醒的机制。本篇我们来讲述等待唤醒机制的三种实现,以及对应的应用场景。
Guarded Suspension 模式
Guarded Suspension 翻译过来就是保护性暂停。其实就是一个线程需要等待获取另外一个线程执行的结果,先把当前线程挂起,另外一个线程执行完毕之后,通知自己,结束阻塞状态,继续执行。
等待唤醒的规范实现如下:
- sychronized+wait/notify/notifyAll
- reentrantLock+Condition(await/singal/singalAll)
- cas+park/unpark
其实底层以来的是pthread,pthread_mutex_lock/unlock pthread_cond_wait/singal。这里就不介绍了,感兴趣的朋友可以自行查阅。
解决线程之间的协作不可避免会用到阻塞唤醒机制
实际编码
syn
package com.jia.suspension;import java.util.Objects;
import java.util.concurrent.TimeUnit;/*** @author qxlx* @date 2023/12/30 3:13 PM*/
public class SynTest {private Object obj;public Object read() {synchronized (this) {while (Objects.isNull(obj)) {try {System.out.println(Thread.currentThread().getName()+ " wait-before");this.wait();System.out.println(Thread.currentThread().getName()+ " wait-after");} catch (InterruptedException e) {e.printStackTrace();}}return obj;}}public void write() {System.out.println(Thread.currentThread().getName()+ " write");synchronized (this) {obj = new Object();System.out.println(Thread.currentThread().getName()+ " notifyAll-before");this.notifyAll();System.out.println(Thread.currentThread().getName()+ " notifyAll-after");}}public static void main(String[] args) throws InterruptedException {SynTest synTest = new SynTest();new Thread(()-> {synTest.read();}).start();new Thread(()-> {synTest.write();}).start();TimeUnit.SECONDS.sleep(2);}}
切记 不能在main线程中启动,需要单独创建两个线程去执行,否则main线程阻塞的话,程序就会阻塞不会执行下去。
conditon
package com.jia.suspension;import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;/*** @author qxlx* @date 2023/12/30 3:31 PM*/
public class ConditionTest {private final Lock lock = new ReentrantLock();private final Condition condition = lock.newCondition();private Object obj;public Object read () {try {lock.lock();while (obj == null) {System.out.println("getLock");condition.await();}} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}return obj;}public void write() {try {lock.lock();obj = new Object();condition.signalAll();System.out.println("唤醒");} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}public static void main(String[] args) throws InterruptedException {ConditionTest test = new ConditionTest();new Thread(()-> {test.read();}).start();new Thread(()-> {test.write();}).start();TimeUnit.SECONDS.sleep(1);}}
LockSouport
package com.jia.suspension;import java.util.concurrent.locks.LockSupport;/*** @author qxlx* @date 2023/12/30 3:38 PM*/
public class LockSupportTest {private Object obj;public Object read() {while (obj == null) {System.out.println("read-线程等待");LockSupport.park();System.out.println("read-线程唤醒");}return obj;}public void write(Thread thread) {obj = new Object();LockSupport.unpark(thread);System.out.println("唤醒线程");}public static void main(String[] args) {LockSupportTest lockSupportTest = new LockSupportTest();Thread thread = new Thread(() -> {lockSupportTest.read();});thread.start();Thread thread2 = new Thread(() -> {lockSupportTest.write(thread);});thread2.start();}}
好了以上就是三种唤醒阻塞的方式。
应用场景
- 多线程环境下多个线程访问相同实例资源,从实例资源中获得资源并处理;
- 实例资源需要管理自身拥有的资源,并对请求线程的请求作出允许与否的判断

在实际的开发中,我们对外提供一个API数据查询的接口,但是需要以来下游系统进行组合数据,将结果写入MQ,下游服务处理完毕后,然后另外一个线程进行获取数据处理。

从图中可以看从处理web请求的是蓝色的线程,而从Topic获取数据的线程是红色线程,也就是蓝色线程异步写入Topic数据后,会阻塞,等待红色线程获取结果后,然后在返回结果。
相关文章:
【并发设计模式】聊聊等待唤醒机制的规范实现
在多线程编程中,其实就是分工、协作、互斥。在很多场景中,比如A执行的过程中需要同步等待另外一个线程处理的结果,这种方式下,就是一种等待唤醒的机制。本篇我们来讲述等待唤醒机制的三种实现,以及对应的应用场景。 G…...
CentOS:docker同一容器间通信
docker同一容器中不同服务以别名访问 1、创建bridge网络 docker network create testnet 2、查看Docker网络 docker network ls 3、运行容器连接到testnet网络 使用方法:docker run -it --name <容器名> —network --network-alias <网络别名> <…...
数据治理:释放数据价值的关键
随着数字化时代的到来,数据已成为组织和企业最重要的资产之一。然而,数据的快速增长和复杂性也给数据管理带来了巨大的挑战。为了确保数据的质量、安全性和合规性,数据治理已成为组织和企业必须面对的重要问题。数据治理是数据要素市场建设的…...
新手快速上手掌握基础排序<一>
听说看到日落金山的人,接下来的日子会顺顺利利,万事胜意,生活明朗-----------林辞忧 引言 从基础的两数交换排序,三四个数排序输出,到学习入门级的排序方法,如冒泡法,选择法,再学…...
2023年03月21日_chatgpt宕机事件的简单回顾
你能想象吗 ChatGPT挂了 昨天半夜呢 来自全球各地的用户纷纷发现 ChatGPT的网站弹出了报错警告的信息 然后立即就无法使用了 即使是有特权的plus账户也未能幸免 一时之间呢 chatgptdown的话题在Twitter刷屏 不少重度的用户表示很着急 有的用户说呢没了ChatGPT 这工作…...
RK3568测试tdd
RK3568测试tdd 一、门禁取包二、烧录三、跑tdd用例四、查看结果参考资料 一、门禁取包 右键复制链接,粘贴下载;解压到文件夹; 二、烧录 双击\windows\RKDevTool.exe打开烧写工具,工具界面击烧写步骤如图所示: 推荐…...
机器学习系列13:通过随机森林获取特征重要性
我们已经知道通过 L1 正则化和 SBS 算法可以用来做特征选择。 我们还可以通过随机森林从数据集中选择相关的特征。随机森林里面包含了多棵决策树,我们可以通过计算特征在每棵决策树决策过程中所产生的的信息增益平均值来衡量该特征的重要性。 你可能需要参考&…...
flink中值得监控的几个指标
背景 为了维持flink的正常运行,对flink的日常监控就变得很重要,本文我们就来看一下flink中要监控的几个重要的指标 重要的监控指标 1.算子的处理速度的指标:numRecordsInPerSecond/numRecordsOutPerSecond,这有助于你了解到算子的是否正在…...
最优化方法Python计算:无约束优化应用——逻辑分类模型
逻辑回归模型更多地用于如下例所示判断或分类场景。 例1 某银行的贷款用户数据如下表: 欠款(元)收入(元)是否逾期17000800Yes220002500No350003000Yes440004000No520003800No 显然,客户是否逾期ÿ…...
springboot定时执行某个任务
springboot定时执行某个任务 要定时执行的方法加上Schedule注解 括号内跟 cron表达式 “ 30 15 10 * * ?” 代表秒 分 时 日 月 周几 启动类上加上EnableScheduling 注释...
Java EE Servlet之Servlet API详解
文章目录 1. HttpServlet1.1 核心方法 2. HttpServletRequest3. HttpServletResponse 接下来我们来学习 Servlet API 里面的详细情况 1. HttpServlet 写一个 Servlet 代码,都是要继承这个类,重写里面的方法 Servlet 这里的代码,只需要继承…...
neo4j运维管理
管理数据库 概念 Neo4j 5(从v4.0),可以同时创建和使用多个活动数据库。 DBMS Neo4j是一个数据库管理系统(DBMS),能够管理多个数据库。DBMS可以管理一个独立的服务器,也可以管理集群中的一组服务器。 实例 Neo4j实例是运行Neo4j服务器代…...
【MYSQL】-函数
💖作者:小树苗渴望变成参天大树🎈 🎉作者宣言:认真写好每一篇博客💤 🎊作者gitee:gitee✨ 💞作者专栏:C语言,数据结构初阶,Linux,C 动态规划算法🎄 如 果 你 …...
传统船检已经过时?AR智慧船检来助力!!
想象一下,在茫茫大海中,一艘巨型货轮正缓缓驶过。船上的工程师戴着一副先进的AR眼镜,他们不再需要反复翻阅厚重的手册,一切所需信息都实时显示在眼前。这不是科幻电影的场景,而是智慧船检技术带来的现实变革。那么问题…...
JAVA进化史: JDK11特性及说明
JDK 11(Java Development Kit 11)是Java平台的一个版本,于2018年9月发布。这个版本引入了一些新特性和改进,以下是其中一些主要特性。 HTTP Client(标准化) JDK 11引入了一个新的HTTP客户端,用…...
模型 安索夫矩阵
本系列文章 主要是 分享模型,涉及各个领域,重在提升认知。产品市场战略。 1 安索夫矩阵的应用 1.1 江小白的多样化经营策略 使用安索夫矩阵来分析江小白市场战略。具体如下: 根据安索夫矩阵,江小白的现有产品是其白酒产品&…...
性能手机新标杆,一加 Ace 3 发布会定档 1 月 4 日
12 月 27 日,一加宣布将于 1 月 4 日发布新品一加 Ace 3。一加 Ace 系列秉持「产品力优先」理念,从一加 Ace 2、一加 Ace 2V 到一加 Ace 2 Pro,款款都是现象级爆品,得到了广大用户的认可与支持。作为一加 2024 开年之作࿰…...
Vue 框架前导:详解 Ajax
Ajax Ajax 是异步的 JavaScript 和 XML。简单来说就是使用 XMLHttpRequest 对象和服务器通信。可以使用 JSON、XML、HTML 和 text 文本格式来发送和接收数据。具有异步的特性,可在不刷新页面的情况下实现和服务器的通信,交换数据或者更新页面 01. 体验 A…...
3分钟快速安装 ClickHouse、配置服务、设置密码和远程登录以及修改数据目录
下面是一个完整的 ClickHouse 安装和配置流程,包括安装 ClickHouse、配置服务、设置密码和远程登录以及修改数据目录。 安装 ClickHouse 安装 YUM 工具包: sudo yum install -y yum-utils添加 ClickHouse YUM 仓库: sudo yum-config-manager…...
PHP8使用PDO对象增删改查MySql数据库
PDO简介 PDO(PHP Data Objects)是一个PHP扩展,它提供了一个数据库访问层,允许开发人员使用统一的接口访问各种数据库。PDO 提供了一种用于执行查询和获取结果的简单而一致的API。 以下是PDO的一些主要特点: 统一接口…...
R语言实战:用sf和ggplot2绘制带比例尺和指北针的专业地图(附完整代码)
R语言地理信息可视化实战:从数据到专业地图的完整指南 地理信息数据可视化是科研和商业分析中不可或缺的一环。无论是环境监测、城市规划还是流行病学研究,将空间数据转化为直观的地图都能极大提升数据洞察力。本文将手把手教你使用R语言中的sf和ggplot2…...
Batex:Blender批量FBX导出终极指南,3D艺术家必备的高效工作流解决方案
Batex:Blender批量FBX导出终极指南,3D艺术家必备的高效工作流解决方案 【免费下载链接】batex Export selected objects as fbx in batch operation 项目地址: https://gitcode.com/gh_mirrors/ba/batex 还在为Blender中繁琐的单个模型导出而烦恼…...
C++笔记 缺省值 函数重载 名字空间域(基础核心)
本文为C基础核心知识点笔记,聚焦「缺省值」「函数重载(概念)」「名字空间域」三大高频基础考点,语言通俗、重点突出,兼顾入门理解和考试记忆,适合新手入门、作业复习及GitHub归档。一、缺省值(默…...
终极桌面伴侣BongoCat:让键盘鼠标操作变得生动有趣的虚拟猫咪
终极桌面伴侣BongoCat:让键盘鼠标操作变得生动有趣的虚拟猫咪 【免费下载链接】BongoCat 让呆萌可爱的 Bongo Cat 陪伴你的键盘敲击与鼠标操作,每一次输入都充满趣味与活力! 项目地址: https://gitcode.com/gh_mirrors/bong/BongoCat …...
Phi-4-Reasoning-Vision一文详解:官方Prompt规范与本地适配实践
Phi-4-Reasoning-Vision一文详解:官方Prompt规范与本地适配实践 1. 项目概述 Phi-4-Reasoning-Vision是基于微软Phi-4-reasoning-vision-15B多模态大模型开发的高性能推理工具,专为双卡4090环境优化。该工具严格遵循官方SYSTEM PROMPT规范,…...
从无人机航拍到手机扫描:聊聊SfM(运动恢复结构)在实际项目中的选型与避坑指南
从无人机航拍到手机扫描:SfM技术实战选型与避坑指南 当我们需要将一座千年古刹数字化存档,或是为电商平台上的家具产品创建3D展示模型时,运动恢复结构(SfM)技术往往成为首选方案。这项能够从普通照片中重建三维场景的技…...
Win11网络卡顿?用Wireshark抓包5分钟定位问题(保姆级实战)
Win11网络卡顿?用Wireshark抓包5分钟定位问题(保姆级实战) 最近在玩《英雄联盟》时,每次团战画面都会卡成PPT,Zoom视频会议也经常出现"机器人音效",作为IT工程师的我决定用Wireshark揪出真凶。没…...
BetterGI 0.38.1版本安装失败?3步快速解决原神自动化工具启动问题
BetterGI 0.38.1版本安装失败?3步快速解决原神自动化工具启动问题 【免费下载链接】better-genshin-impact 🍨BetterGI 更好的原神 - 自动拾取 | 自动剧情 | 全自动钓鱼(AI) | 全自动七圣召唤 | 自动伐木 | 自动派遣 | 一键强化 - UI Automation Testin…...
Neeshck-Z-lmage_LYX_v2实际作品:基于LoRA微调的专属IP形象批量生成
Neeshck-Z-lmage_LYX_v2实际作品:基于LoRA微调的专属IP形象批量生成 1. 引言:从零到一,打造你的专属数字形象 想象一下,你需要为你的品牌、游戏或者社交媒体账号设计一套统一的视觉形象。传统的做法是找设计师,沟通需…...
AI助力:让快马平台智能生成排列组合列举与计算一体化工具
最近在做一个数据分析项目时,遇到了需要批量计算排列组合的需求。传统的手动计算不仅效率低,还容易出错。于是我开始寻找更智能的解决方案,发现InsCode(快马)平台的AI辅助开发功能正好能帮我快速实现这个工具。 需求分析 排列组合在概率统计、…...
