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

什么叫做 Guarded Suspension ?

guarded 的意思是”守护、担保“,suspension的意思是”悬挂、停止“,连起来的意思就是”受保护的暂停“。该模式常用在线程访问某个对象时,发现条件不满足,于是便暂时挂起等待条件满足再发起访问。

Guarded Suspension 的应用场景

在并发设计中,很多设计场景都有这种设计模式的影子,比如:

  • Java中的join、Future、FutureTask
  • 生产消费模式
  • Worker Thread设计模式
  • Java并发包中的 ArrayBlockingQueue

等等都使用了这种设计模式。

Guarded Suspension 源码展示
join()
public final synchronized void join(long millis)
throws InterruptedException {long base = System.currentTimeMillis();long now = 0;if (millis < 0) {throw new IllegalArgumentException("timeout value is negative");}if (millis == 0) {while (isAlive()) {wait(0);}} else {while (isAlive()) {long delay = millis - now;if (delay <= 0) {break;}wait(delay);now = System.currentTimeMillis() - base;}}
}

当调用无参join()方法时,就是形参millis = 0,从上面源码可以看出,当millis = 0时,调用线程开始了死等。等待正在执行的线程执行结束。

在Java源码中java.util.concurrent.ArrayBlockingQueue类中有两个方法是值得关注的:

put()
public void put(E e) throws InterruptedException {checkNotNull(e);final ReentrantLock lock = this.lock;lock.lockInterruptibly();try {while (count == items.length)notFull.await();enqueue(e);} finally {lock.unlock();}
}
take()
public E take() throws InterruptedException {final ReentrantLock lock = this.lock;lock.lockInterruptibly();try {while (count == 0)notEmpty.await();return dequeue();} finally {lock.unlock();}
}

当Queue容量达到上限时,一个线程调用put() 方法便陷入了无时限的等待,直到Queue容量不再满。

当Queue容量为0时,一个线程调用take() 方法也会陷入无时限的等待,直到Queue容量不为0。

Guarded Suspension 自定义实现

根据Java提供的源码,我们可以自定义设计出一个和 Guarded Suspension 模式有关的项目案例:

在一家餐馆里,来了一位客人点餐,客人点完餐后,厨师就开始做菜,在厨师做菜期间,服务员会根据餐盘中是否有菜判断菜是不是做好了,如果做好了,就去给客户送餐。

代码实现如下:

public class Test {public static void main(String[] args) throws InterruptedException {log.debug("客户开始点餐");//str1 str2 作为做菜的材料String str1 = "鱼香";String str2 = "肉丝";Object lock = new Object();//str3作为餐盘final String[] str3 = {null};new Thread(() -> {synchronized (lock) {log.debug("厨师开始做菜");try {Thread.sleep(3000L);} catch (InterruptedException e) {e.printStackTrace();}log.debug("厨师把菜做好了, 并装入了盘中");str3[0] = str1 + str2;lock.notify();}}, "厨师").start();Thread.sleep(200);new Thread(() -> {log.debug("服务员开始尝试获取鱼香肉丝");//如果餐盘为空,则表示没有做好if (str3[0] == null) {log.debug("厨师还没做好,获取失败");log.debug("开始等待厨师做菜");synchronized (lock) {}}log.debug("服务员成功获取到了菜");}, "服务员").start();}
}

根据代码的运行结果可以看出,厨师开始做菜后,服务员尝试获取,但发现条件不满足后,便开始了无时限的等待,直到厨师做好了菜,这就是典型的保护性暂停案例。

除了一对一以外,还有一对多,多对多的情况,线程池便是运用了多对多的情况。

并且针对以上代码,我们还可以根据情况给出相应的优化,比如有时限的等待,如果一段时间内未获取到满足的条件,便放弃本次获取等等。

总结

相对来说Guarded Suspension设计模式并不是一个复杂的模式而是比较简单的一个模式,从上面例子中可以看出使用也相对比较简单。Guarded Suspension 的关注点还是在于临界值的是否满足条件。当达到设置的临界值是相关线程会被挂起。在很多的设计场景中都有这种设计模式的影子。

相对来说Guarded Suspension设计模式并不是一个复杂的模式而是比较简单的一个模式,从上面例子中可以看出使用也相对比较简单。Guarded Suspension 的关注点还是在于临界值的是否满足条件。当达到设置的临界值是相关线程会被挂起。在很多的设计场景中都有这种设计模式的影子。

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

  1. 实战并发编程 - 08基于Guarded Suspension模式优化轮询while(true)

    文章目录 Guarded Suspension模式简介 看牙医的就诊流程 代码举例 总结与拓展 Guarded Suspension模式简介 guarded在这里是"保护"的意思: ...

  2. 实战并发编程 - 09多线程Guarded Suspension模式案例实战

    文章目录 需求 Code (上) [1. init初始化报警服务] [2.onConnected方法建立连接] [3.HeartbeatTask心跳检查] [4.tesConnection测试是否连接 ...

  3. Java高并发编程详解系列-Guarded Suspension设计模式

    导语   什么是Guarded Suspension模式,Suspension 意思是挂起,暂停的.而Guarded则表示担保的意思,连起来的就是确保挂起.也就是说当线程访问某个对象的时候,发现条件不 ...

  4. 并发设计模式之Guarded Suspension模式

    - 原文链接: http://www.joyhwong.com/2016/11/19/并发设计模式之guarded-suspension模式/ Guarded Suspension意为保护暂停,其核心 ...

  5. Java并发编程实战~Guarded Suspension模式

    Guarded Suspension 模式 比如,项目组团建要外出聚餐,我们提前预订了一个包间,然后兴冲冲地奔过去,到那儿后大堂经理看了一眼包间,发现服务员正在收拾,就会告诉我们:"您预订的 ...

  6. 【Java并发】同步模式之保护性暂停

    public class 设计模式_保护性暂停 {public static void main(String[] args) {GuardedObject guardedObject = new G ...

  7. java暂挂状态,Guarded Suspension(保护性暂挂)模式

    思维导图 思维导图 Guarded Suspension 模式简介 Guarded Suspension 模式的核心是一个受保护方法(Guarded Method).该方法在执行其所需要真正执行的操作 ...

  8. java并发 设计模式,Java并发——设计模式

    并发模式 Ⅰ 同步模式--保护性暂停模式(Guarded Suspension) 用在一个线程等待另一个线程的执行结果.JDK中join和Future的实现就是采用此模式 image-20201227 ...

  9. Java架构师,大数据架构师,高并发设计模式,机器学习知识点分享

    第一章:java精品课程目录大全 1.亿级流量电商详情页系统的大型高并发与高可用缓存架构实战 1课程介绍以及高并发高可用复杂系统中的缓存架构有哪些东西?32分钟 2基于大型电商网站中的商品详情页系统贯 ...

最新文章

  1. Web Api学习一
  2. linux常用shell命令面试,shell经典笔试题目总结
  3. ping的实现和代码分析
  4. 136. Single Number
  5. WSP (无线会话协议)
  6. ios系统框架一: Core Animation
  7. 一种手机保密桌面的想法
  8. C语言练习题:算术入门之加减乘除(PTA)
  9. 如龙0pc端与计算机王玩游戏卡住,如龙0游戏停止工作怎么办_游戏未响应闪退解决方法_3DM单机...
  10. 青花瓷Charles安装
  11. java发送QQ邮件详细步骤
  12. 通过阿里云API 身份证图片或拍身份证 读取身份证正反面信息
  13. win7计算机不能设置双屏怎么回事,win7系统怎么设置双屏显示 win7电脑双屏显示功能使用方法...
  14. 机房监控系统解说—防火墙篇
  15. 联想笔记本查看电池寿命、近期用电情况和续航估计报告
  16. 数据库系统概论 第七章 数据库设计(1)特点,概述,设计方法,规范设计方法,新奥尔良方法,用户和数据库管理员,模式,外模式,概念模式,逻辑模式,内模式,需求分析,数据项,数据流,数据存储,处理过程
  17. python discuz论坛帖子_[Scrapy爬虫实战]Discuz论坛版块内全部帖子获取
  18. WIFI性能测试二 --- wifi的ANI功能
  19. 计算机网络必看之·你确定了解应用层吗?(下)12/3最新补充
  20. 《生命科学50讲》课程笔记10-自由意志

热门文章

  1. win10无法登陆到你的账户
  2. 郑州轻工业大学OJ python1102: 火车票退票费计算(函数专题)
  3. 平行束投影数据的仿真
  4. 电脑怎么查看计算机历史记录,win7电脑使用记录怎么查询_win7电脑使用历史记录如何查看-win7之家...
  5. 持续不断更新中... 自己整理的一些前端知识点以及前端面试题,包括vue2,vue3,js,ts,css,微信小程序等
  6. 分享8款令人惊叹的HTML5 Canvas动画特效
  7. 5G专网是个大西瓜(三):合成之难
  8. 【PLC编程】简易梯形图
  9. ant design的Switch组件的坑,怎么更改Switch的状态?
  10. Spring 源码中设计模式?这样回答面试官.才能显得你技高一筹.