JAVA多线程设计模式篇 4、Guarded Suspension 模式——等我准备好了再来

2020年的Java程序员面试三件套:多线程+算法,java高级程序设计实战教程戴远泉答案 “设计模式”一词也常常会让开发人员感到畏惧。其实设计模式不过是对代码设计方式的总结和归纳。在我们的代码中,设计模式无处不在,只是我们没有注意到它们而已。善用设计模式可以帮助我们编写出具有高可复用性且松耦合的代码。 那么,今天就把“多线程”与“设计模式”这两个主题放在一起,是不是已经开始有点期待还有点畏惧了呢?但是软件开发就是这么一件有趣的事情——随着我们心中的恐惧与日俱增,想要试着挑战的心情也会越来越迫切。 推荐理由: 编写了300个Java示例程序来实现设计模式,掌握这些设计模式,可以避免程序发生死锁、节 阅读详情

文章目录

Guarded Suspension模式是多线程设计模式中的一个基础模式,不仅在应用程序中使用频繁,而且也有其他模式会用到它。模式核心是一个受保护方法(Guarded Method)。该方法执行其所要真正执行的操作时需要满足特定的条件(Predicate,以下称之为保护条件)。当该条件不满足时,执行受保护方法的线程会被挂起进入等待(WAITING)状态,直到该条件满足时该线程才会继续运行。此时,受保护方法才会真正执行其所要执行的操作。为方便起见,以下称受保护方法所要真正执行的操作为目标动作。

while(守护条件){
	try{
		wait();
	} catch(InterruptedException e){
	}
}
do();//执行操作

为什么使用while和wait配合,请参加JAVA多线程番外篇

实现的线程挂起与唤醒功能固然可以由应用代码直接使用wait/notify或者java.util.concurrent.locks.Condition来实现. 阻塞队列类java.util.concurrent.LinkedBlockingQueue就使用了Guarded Suspension模式。该类的take方法用于从队列中取出一个元素。如果take方法被调用时,队列是空的,则当前线程会被阻塞;直到队列不为空时,该方法才返回一个出队列的元素。LinkedBlockingQueue在实现Guarded Suspension模式时,使用了java.concurrent.locks.Condition。

总结

Guarded Suspension模式是多线程设计模式中的一个基础模式,不仅在应用程序中使用频繁,而且也有其他模式会用到它。

多线程系列在github上有一个开源项目,主要是本系列博客的实验代码。

https://github.com/forestnlp/concurrentlab

如果您对软件开发、机器学习、深度学习有兴趣请关注本博客,将持续推出Java、软件架构、深度学习相关专栏。

您的支持是对我最大的鼓励。

Realtek RTD1319D芯片解析:H.266与AV1双解码的机顶盒SoC 视频编解码技术是数字媒体传输的核心,H.266/VVC作为新一代标准,相比H.265提升50%压缩效率,显著降低带宽需求。其实现原理依赖于专用硬件解码器和并行处理架构,在超高清视频传输领域具有重要价值。Realtek RTD1319D作为首款商用H.266处理器,采用异构计算设计,集成四核ARM CPU和独立视频处理单元,同时支持AV1解码,兼顾市场兼容性。该SoC特别适合4K机顶盒、数字标牌等应用场景,其HDMI 2.1a接口和DVB解调器为超高清内容传输提供完整解决方案。开发时需注意散热设计和内存配置优 阅读详情

相关推荐

FreeRTOS系统CPU使用率统计

操作系统中CPU使用率是在软件架构设计中必须要考虑的一个重要性能指标。它直接影响到程序的执行时间以及优先级更高的任务能否实时响应的问题。而CPU使用率也不能过低,避免资源浪费。

灵哎惹,凌沃敏的博客 1378

【Java】设计模式之保护性暂停

线程2也对保护对象加锁,当它执行完毕之后,将结果记录在保护对象的response之中然后执行notifyAll()方法唤醒线程1。线程1被唤醒,它就可以从保护对象的response属性中拿到线程2处理的结果。想要让一个线程等待另一个线程的执行结果,可以让这两个线程都关联上同一个 Guarded 0bject保护对象,让对象的管程的waitset来充当通知的桥梁,使用对象的wait()/notify()方法来进行通知。有一个结果需要从一个线程传递到另一个线程,传递只进行一次,用设计模式保护性暂停。

第三季度的博客 836

Langfuse落地教程:从Docker部署到项目接入,掌控LLM调用链路

大模型应用开发中,调用链路的透明度直接决定调试效率与成本控制。可观测性技术通过记录每次请求的输入、输出、模型参数与Token消耗,帮助开发者快速定位问题。Langfuse作为开源LLM可观测性平台,将Trace、Prompt版本管理、评分等能力集成于一体,支持Docker Compose自托管部署,并提供Python/JS SDK与REST API。借助部署后的控制台,团队能够直观追踪RAG检索、Agent工具调用等复杂流程中的每一步耗时与资源占用,实现从黑盒调用到全链路可视化的转变。无论是本地调试、线上排

weixin_29698641的博客 308

Java 多线程模式 —— Guarded Suspension 模式

Part1Guarded Suspension 模式的介绍我们只从字面上看,Guarded Suspension 是受保护暂停的意思。1Guarded Suspension 模式在实际的并发编程中,Guarded Suspension 模式适用于某个线程需要满足特定的条件(Predicate)才能执行某项任务(访问受保护对象)。条件未满足时,则挂起线程,让线程一直处于 W...

Java与Android技术栈 469

从建模到调参:基于Simulink的两轮差速机器人轨迹跟踪PID控制全流程解析

本文详细解析了基于Simulink的两轮差速机器人轨迹跟踪PID控制全流程,涵盖运动学建模、仿真环境搭建、PID控制器设计与实现等关键环节。通过Simulink仿真和可视化调试技巧,帮助开发者掌握移动机器人运动控制的核心技术,提升轨迹跟踪精度与性能优化能力。

weixin_28717683的博客 243

窥秘Windows 10:SAM密码破解

Windows 10作为广受欢迎的操作系统,拥有一套强大的安全措施来保护用户账号和数据安全。然而,有时候我们需要了解更多关于密码破解的知识,以加强我们的防护措施。本文将深入探讨如何突破Windows 10的SAM密码,以便更好地了解密码安全性并加强系统的保护。

Sgirll的博客 6844

并发设计模式——保护性暂停(Guarded Suspension)

一种简单基础的并发设计模式——保护性暂停模式

m0_56642345的博客 862

【JTAG】1149.6协议详解

JTAG1149.6协议是1149.1协议中Boundary-Scan结构的扩展,1149.1对交流耦合、差分或两者兼有的情况并没有得到充分的处理。该协议支持新的I/O测试结构。需要时变(AC)信号的高级I/O引脚允许测试它们之间的连接,这包括所有差分信号引脚或单端信号引脚,通过设计支持交流耦合。..................

xuhe0206的博客 4574

java多线程设计模式之Guarded Suspension

想象一个场景,你在排队领军训的装备,当你排队到窗口的时候,工作人员对你说,等一下,让我叫后勤先去仓库取下装备再给你,于是你等到工作人员取回装备才能领走装备。 抽象为一个java程序模型:你是一个线程ClientThread,负责取数据Request,暂时存放装备的窗口是一个队列RequestQueue,后勤人员是一个存放装备的线程ServerThread,于是可以用一下代码表示: 首先是存放数

易水南风的专栏 1273

TPAMI 2025 | 从缺失碎片到杰作:基于上下文自适应扩散的图像修复

图像修复是一项具有挑战性的任务,尤其是要确保生成的内容与图像的现有部分无缝融合。尽管最近的扩散模型展现出了潜力,但它们在保持已知区域和未知(缺失)区域之间的连贯性方面常常遇到困难。这个问题源于扩散过程中缺乏明确的空间和语义对齐,导致生成的内容无法与原始图像平滑融合。此外,扩散模型通常依赖全局学习分布,而非局部特征,这使得生成的图像部分与现有图像部分之间存在不一致。在这项工作中,作者提出了ConFill,这是一个新颖的框架,引入了上下文自适应差异(CAD)模型,以确保在整个扩散过程中,已知区域和未知区域的中间

小白学视觉 240

2025年11月架构设计师综合知识真题回顾,附参考答案、解析及所涉知识点(二)

本文整理了2025年11月架构设计师考试的16-30题真题及解析,涵盖多个计算机系统知识领域。主要内容包括:Linux绝对路径以根目录开始(A);模块调用下层数量用扇出表示(B);游乐园问题通过集合运算得出10人未游玩(B);磁盘位示图计算为200字节(C);测试用例核心是输入与预期输出(D)。其他题目涉及软件可靠性测试概念(B错)、评价程序准确度排序(真实程序最高,A)、测试阶段顺序(单元→组装→系统,A)、Web服务器压力测试前置步骤(C)、分时系统响应时间影响因素(用户数量多,A)、逆向工程方法(基于

一几文的编程学习笔记。 225

等待唤醒规范化之Guarded Suspension模式

Guarded Suspension模式 什么是Guarded Suspension模式 Guarded Suspension直译为保护性挂起,其核心是一个受保护的方法,该方法在执行其所需要真正执行的操作时需要满足特定的条件,当条件状态不满足时,执行受保护方法的线程挂起并进入等待状态,直到条件状态满足该线程才能继续执行。 现实场景 在我们生活中其实有很多这种场景例如,我们去外面用餐提前在网上预定了一个包间,然后到时间过去用餐,找到大堂经理这时经理发现包间还没收拾,就叫服务员马上收拾,让我们稍等片刻,大堂经理

zzf1233的博客 468

Vibe Draw:AI实现2D草图转3D建模,开源免费的设计师宝藏软件!

AI实现2D草图转3D建模,开源免费,设计师进来看一下?

Code_流苏:在代码中寻诗意,在实践中觅真知 2150

图解多线程设计模式pdf_图解Java多线程设计模式 PDF 全书扫描版

序章1 Java线程 1I1.1 Java线程 2I1.2 何谓线程 2明为跟踪处理流程,实为跟踪线程 2单线程程序 3多线程程序 4Thread类的run方法和start方法 5I1.3 线程的启动 9线程的启动(1)——利用Thread类的子类 9线程的启动(2)——利用Runnable接口 10I1.4 线程的暂停 12I1.5 线程的互斥处理 13synchronized方法 14sync...

weixin_30839665的博客 1426

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Guarded Suspension设计模式

1 要解决的问题     Guarded Suspension(保护暂停),其核心思想是:仅当服务端进程准备好后,才提供服务。假设一种场景,服务器可能会在短时间内接收到大量的客户端请求,可能已经超过了服务器的负载,而服务器又不能随意丢弃任何一个用户的请求。此时,最佳的处理方案莫过于让客户端请求排队,由服务器一个一个的处理。这样,既保证了所有的客户端请求不会丢失,同时也避免了服务器由于同时处理太多

XiuXiuBlaza 1068

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

《图解Java多线程设计模式》笔记 Guarded Suspension模式

Guarded Suspension模式–等我准备好哦。例如:快递员敲你家门,你还在衣衫不整的睡觉。你会大声应答到:等我准备好哦。此时快递员会一直在门外等你准备好。 Guarded是被守护、被保护的意思,Suspension是暂停的意思。这两个单词很好的阐述了该模式的特点。该模式是通过线程的等待来保证实例的安全性。 应用场景:一个线程ClientThread会将请求Request的实例通过...

300

并发设计模式之Guarded Suspension模式

- 原文链接:http://www.joyhwong.com/2016/11/19/并发设计模式之guarded-suspension模式/ Guarded Suspension意为保护暂停,其核心思想是仅当服务进程准备好时,才提供服务。设想一种场景,服务器可能会在很短时间内承受大量的客户端请求,客户端请求的数量可能超过服务器本身的即时处理能力,而服务端程序又不能丢弃任何一个客户请求...

diaoju3333的博客 73

并发编程中常见的设计模式

思考:在一个线程T1中如何正确安全的终止线程T2错误思路1使用线程对象的stop()方法停止线程,因为Stop方法会真正杀死线程,如果这时线程锁住了共享资源,那么当它被杀死后就再也没有机会释放锁,其它线程将永远无法获取锁。错误思路2使用System.exit(int)方法停止线程,目的仅是停止一个线程,但这种做法会让整个程序都停止。Immutability模式,Copy-on-Write模式,Thread-Specific Storage模式本质上是为了避免共享。

qq_43456605的博客 1579

java多线程之Guarded Suspension模式

Guarded Suspension模式(等我准备好哦)在Single Threaded Execution模式中,只要有一个线程进入临界区,其他线程就无法进入,只能等待。而在Guarded Suspension模式中,线程是否等待取决于守护条件。Guarded Suspension模式是在Single Threaded Execution模式的基础上附加了条件而形成的。 如下一段代码实例:  r...

qq_31350373的博客 586

java guardedby_java 多线程并发设计模式之三:Guarded suspension 模式

这是一种是用很多的设计模式, 其核心思想就是服务线程开始就准备好,不断查看是否有新的请求,如果有新的请求,就处理。但事实上,服务端的处理能力很有可能有限,但是作为程序的健壮性,不可能丢掉任何一个客户端请求,这种一个比较好的方案就是对客户端的请求进行排队,放到队列里面,然后服务线程一个一个处理。这样至少能避免服务端处理太多请求而崩溃。如下例子假设:程序一开始就开启10个服务线程,一直处于等待状态,查...

weixin_30781905的博客 196

图解多线程设计模式pdf_多线程设计模式

多线程开发可以更好的发挥多核cpu性能,常用的多线程设计模式有:Future、Master-Worker、GuardSusperionsion、不变、生产者-消费者 模式;jdk除了定义了若干并发的数据结构,也内置了多线程框架和各种线程池;锁(分为内部锁、重入锁、读写锁)、ThreadLocal、信号量等在并发控制中发挥着巨大的作用。多线程设计模式:1.Single Threaded E...

weixin_34305091的博客 296

Java多线程模式

介绍以下多线程模式,这里主要是列举Java有哪些线程模式以及其主要的使用方式。详情可阅读《Java多线程模式》一书。   1、Single Thread Execution——能通过这座桥的,只有一个人 该模式用锁来保护关键的执行区域。   2,Immutable ——不可破坏的 Immutable类是指实例化之后状态不再改变的类。 该模式可以在以下情况下考虑使用:确认类的实例状态不

Roy的IT笔记 833

并发编程中常见的设计模式,c++多线程如何设计

类 Unix 的操作系统中创建进程的 API 是 fork(),传统的 fork() 函数会创建父进程的一个完整副本,例如父进程的地址空间现在用到 了1G 的内存,那么 fork() 子进程的时候要复制父进程整个进程的地址空间(占有 1G 内存) 给子进程,这个过程是很耗时的。没有修改操作,也就是保持了不变性。如果在某一段业务高峰期的时间里生产者“生产”任务的速率很快,而消费者“消费”任务速率很慢,由于中间的任务队列的存在,也可以起到缓冲的作用,我们在使用MQ中间件的时候,经常说的削峰填谷也就是这个意思。

zxf347085420的博客 1682

Java并行程序设计模式——Guarded Suspension模式

问题引出 假如说你的服务器在很短时间内承受了大量的客户端请求(如果这是你朋友用Python搞你的话请好好打他一顿),客户端请求量可能超过了服务器本身的即时处理量,而服务端程序又不能丢弃任何一个客户请求,应该怎么办? 答:最佳处理方案莫过于让客户端排队请求进行排队,由服务端程序一个个处理。这样既保证了所有的客户端请求均不丢失,同时也避免了服务器由于同时处理太多的请求而崩溃。这就是Guarded Su...

驼君的小小博客园 288

图解java多线程设计模式-第三章 Guarded Suspension 模式

以下内容是我在阅读《图解Java多线程设计模式》一书中的总结和思考 本章配图文字:等我准备好哦。   定义 当不符合继续执行时,通过让线程等待来保证实例的安全性。   类的一览表 名字 说明 Request 存储信息数据的类 RequestQueue 存放Request实例对象,采用互斥方法来保证对Request实例对象操作时的线程安全 ClientTh...

Luke_R的博客 469

多线程模式uml

(三) 线程设计模式 什么是模式呢?Martin Flower先生这样描述:一个模式,就是在实际的上下文中,并且在其他上下文中也会有用的想法。 这边的线程设计模式大部分参考自林信良先生的《设计模式》,还有一些网路的文章,这些都是前辈们在使用线程时候的经验,非常值得我们借鉴。还有就是林信良先生的设计模式非常通俗易懂,是入门级选手的最佳选择。关于线程的模式应该还有别的,只是我这边现在只能总结这...

dingyinlong的博客 2757
上一篇: JAVA多线程设计模式篇 3、Immutable 模式——无欲则刚,练就金刚不坏之身
下一篇: JAVA多线程设计模式篇 5、Balking 模式——不需要就算了
悟空学编程
博客等级 码龄12年 32粉丝 123原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟空学编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值