IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 等待唤醒规范化之Guarded Suspension模式 -> 正文阅读

[Java知识库]等待唤醒规范化之Guarded Suspension模式

Guarded Suspension模式

什么是Guarded Suspension模式

Guarded Suspension直译为保护性挂起,其核心是一个受保护的方法,该方法在执行其所需要真正执行的操作时需要满足特定的条件,当条件状态不满足时,执行受保护方法的线程挂起并进入等待状态,直到条件状态满足该线程才能继续执行。

现实场景

在我们生活中其实有很多这种场景例如,我们去外面用餐提前在网上预定了一个包间,然后到时间过去用餐,找到大堂经理这时经理发现包间还没收拾,就叫服务员马上收拾,让我们稍等片刻,大堂经理发现服务员收拾完毕后就会将我们带到指定包间,这个过程就是一个典型的Guarded Suspension模式。

这时我们可以将处理流程结构化如下所示

我们需要注意的是Guarded Suspension模式的条件变量这里指的就是餐厅是否打扫干净这个条件。

image-20220312172235148

场景语义化如下

// 大堂经理
class GuardedObject<T> {
    // 受保护对象 餐厅
    private T obj;
    private final Lock lock = new ReentrantLock();

    private final Condition done = lock.newCondition();

    public GuardedObject(T obj){
        this.obj = obj;
    }

    // 获取受保护对象
    public T get(Predicate<T> p){
        lock.lock();
        try {
            while (!p.test(obj)){
                System.out.println("====大堂经理询问是否可以就餐====");
                done.await(1, TimeUnit.SECONDS);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
        return obj;
    }
	// 给服务员用,打扫完包间就将包间的状态改为干净
    public void onChanged(T obj){
        lock.lock();
        try {
            this.obj = obj;
            done.signalAll();
        }finally {
            lock.unlock();
        }
    }
}

测试代码如下

public static void main(String[] args) throws InterruptedException {
    // obj=1表示餐厅还没收拾  obj=0表示收拾好了可以用餐
    GuardedObject<Integer> guardedObject = new GuardedObject(1);

    // 顾客就餐
    Thread t1 = new Thread(()->{
        System.out.println(Thread.currentThread().getName()+"==顾客进入餐厅");
        // d
        Integer integer = guardedObject.get(e -> {
            return 0 == e;
        });
        System.out.println(Thread.currentThread().getName()+"==顾客可以用餐");
    });

    // 服务员打扫
    Thread t2 = new Thread(()->{
        try {
            System.out.println(Thread.currentThread().getName()+"==服务员开始打扫");
            TimeUnit.SECONDS.sleep(5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        guardedObject.onChanged(0);
        System.out.println(Thread.currentThread().getName()+"==服务员打扫完毕");
    });

    t1.start();
    Thread.sleep(500);
    t2.start();

    t1.join();
    t2.join();
}

执行结果如下

image-20220312172916136

总结

Guarded Suspension模式其本质就是等待唤醒机制的一种规范,如果解决实际问题需要或多或少的对Guarded Suspension功能进行扩展(一般是多一个等待队列,任务按照顺序出队处理)。

Guarded Suspension又被称为Guarded Wait 模式、Spin Lock 模式(因为使用了 while 循环去等待),多线程版本if(单线程场景中if语句不需要等待主线程阻塞将没有线程执行了,if判断条件也不会发生变化,而多线程下当前线程的判断结果是有可能被别的线程所篡改的)。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-03-15 22:18:55  更:2022-03-15 22:20:24 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 10:03:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码