一、定义

guarded是“被保护着的”、“被防卫着的”意思,suspension则是“暂停”的意思。当现在并不适合马上执行某个操作时,就要求想要执行该操作的线程等待,这就是Guarded Suspension Pattern。

Guarded Suspension Pattern 会要求线程等候,以保障实例的安全性,其它类似的称呼还有guarded wait、spin lock等。

二、模式案例

下面的案例是一种简单的消息处理模型,客户端线程发起请求,有请求队列缓存请求,然后发送给服务端线程进行处理。

Request类:

//request类表示请求

public class Request {

private final String name;

public Request(String name) {

this.name = name;

}

public String getName() {

return name;

}

public String toString() {

return "[ Request " + name + " ]";

}

}

客户端线程类:

//客户端线程不断生成请求,插入请求队列

public class ClientThread extends Thread {

private Random random;

private RequestQueue requestQueue;

public ClientThread(RequestQueue requestQueue, String name, long seed) {

super(name);

this.requestQueue = requestQueue;

this.random = new Random(seed);

}

public void run() {

for (int i = 0; i < 10000; i++) {

Request request = new Request("No." + i);

System.out.println(Thread.currentThread().getName() + " requests " + request);

requestQueue.putRequest(request);

try {

Thread.sleep(random.nextInt(1000));

} catch (InterruptedException e) {

}

}

}

}

服务端线程类:

//客户端线程不断从请求队列中获取请求,然后处理请求

public class ServerThread extends Thread {

private Random random;

private RequestQueue requestQueue;

public ServerThread(RequestQueue requestQueue, String name, long seed) {

super(name);

this.requestQueue = requestQueue;

this.random = new Random(seed);

}

public void run() {

for (int i = 0; i < 10000; i++) {

Request request = requestQueue.getRequest();

System.out.println(Thread.currentThread().getName() + " handles " + request);

try {

Thread.sleep(random.nextInt(1000));

} catch (InterruptedException e) {

}

}

}

}

请求队列类:

public class RequestQueue {

private final LinkedList queue = new LinkedList();

public synchronized Request getRequest() {

while (queue.size() <= 0) {

try {

wait();

} catch (InterruptedException e) {

}

}

return (Request)queue.removeFirst();

}

public synchronized void putRequest(Request request) {

queue.addLast(request);

notifyAll();

}

}

注:getRequest方法中有一个判断while (queue.size() <= 0),该判断称为Guarded Suspension Pattern 的警戒条件(guard condition)。

执行:

public class Main {

public static void main(String[] args) {

RequestQueue requestQueue = new RequestQueue();

new ClientThread(requestQueue, "Alice", 3141592L).start();

new ServerThread(requestQueue, "Bobby", 6535897L).start();

}

}

三、模式讲解

角色:

Guarded Suspension Pattern 的角色如下:

GuardedObject (被防卫的对象)参与者

GuardedObject 参与者是一个拥有被防卫的方法(guardedMethod)的类。当线程执行guardedMethod时,只要满足警戒条件,就能继续执行,否则线程会进入wait set区等待。警戒条件是否成立随着GuardedObject的状态而变化。

GuardedObject 参与者除了guardedMethod外,可能还有用来更改实例状态的的方法stateChangingMethod。

在Java语言中,是使用while语句和wait方法来实现guardedMethod的;使用notify/notifyAll方法实现stateChangingMethod。如案例中的RequestQueue 类。

注意:Guarded Suspension Pattern 需要使用while,这样可以使从wait set被唤醒的线程在继续向下执行前检查Guard条件。如果改用if,当多个线程被唤醒时,由于wait是继续向下执行的,可能会出现问题。

java guardedby_Java多线程基础(五)——Guarded Suspension模式相关推荐

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

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

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

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

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

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

  4. 多线程基础之设计模式Future模式

    一. Future模式介绍 前面的 Thread-Per-Message 模式将耗时时间的处理交给其他线程, 的确可以提高程序的响应性, 但是在将处理交出去的时候, 处理结果仍是未知的, 而等待处理结 ...

  5. Java 并发/多线程教程(五)-相同线程

    本系列译自jakob jenkov的Java并发多线程教程,个人觉得很有收获.由于个人水平有限,不对之处还望矫正! 相同线程是一并发框架模型,是一个单线程系统向外扩展成多个单线程的系统.这样的结果就是 ...

  6. 多线程模式(2):Guarded Suspension模式

    为什么80%的码农都做不了架构师?>>>    封装请求类 package com.xqi.g_s;import com.xqi.f.Data;/*** 请求封装* * @autho ...

  7. java workthread_Java多线程基础(十)——Work Thread模式

    一.定义 Work Thread模式和Thread-Per-Message模式类似,Thread-Per-Message每次都创建一个新的线程处理请求,而Work Thread模式预先会创建一个线程池 ...

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

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

  9. JAVA中多线程基础知识

    程序(软件):数据和指令的集合.软件架构:B/S  C/S  软件分类:系统软件,应用软件. 进程:正在运行的程序,会在内存中分配空间. 线程:进程中的多条路径. 多线程是指有多条线程并发的执行. 并 ...

  10. Java 并发——多线程基础

    Thead类与Runnable接口 Java的线程,即一个Thread实例. Java的线程执行过程有两种实现方式: 子类继承Thread类,并且重写void run()方法. 自定义类实现Runna ...

最新文章

  1. linux卸载桌面Ubuntu,Ubuntu安装卸载KDE桌面之折腾记
  2. 从脸部识别到火星机器人,正在改变世界的计算机视觉
  3. JVM中锁优化,偏向锁、自旋锁、锁消除、锁膨胀
  4. 两个php的build文件,PHP编译安装中遇到的两个错误和解决方法
  5. Ansible管理节点过多导致的超时问题解决方法
  6. java get方法不序列化_java常用序列化与反序列化方法
  7. 如何手工删除残留的DFS NAMESPACE
  8. python中使用ZADD方法报错AttributeError: 'int' object has no attribute 'items'
  9. java面试题-----------静态代码块和代码块和构造方法执行顺序
  10. 研究人员发现:基于文本的AI模型容易受到改述攻击
  11. python paramiko exec_command()和invoke_shell()
  12. 陈绪:7月24日阿里云上海峰会出品人
  13. Git : SSH 协议服务器
  14. android下拉水波纹,android自定义WaveView水波纹控件
  15. STM32使用虚拟示波器
  16. spark web ui中的skipped的含义
  17. Objective-c中Category的用法
  18. kali中文输入法的安装
  19. 【小白渗透入门系列】P5 自动化渗透测试工具
  20. python3输入参数_python3 十一、命令行传参

热门文章

  1. 360校招题之小明看花
  2. 如何获取未安装apk应用的包名、应用名以及版本信息等
  3. 40.用创业思维复盘:写技术博客到出书
  4. rabbit 消息丢失
  5. 青龙2.10.13 稳定版+xdd-plus+阿东教程保姆教程(2022年7月11日更新)
  6. Fabric CA 用户指南
  7. javascript_video_2
  8. Azure实现虚拟机的自动开关机
  9. 【读书笔记】《正面管教》——我们都不完美,但我们相处的很快乐
  10. 给想上MIT的牛学生说几句