设计模式之多线程版本的if------Guarded Suspension模式

系列文章目录

设计模式之避免共享的设计模式Immutability(不变性)模式
设计模式之并发特定场景下的设计模式 Two-phase Termination(两阶段终止)模式
设计模式之避免共享的设计模式Copy-on-Write模式
设计模式之避免共享的设计模式 Thread-Specific Storage 模式



提示:以下是本篇文章正文内容,下面案例可供参考

Guarded Suspension是什么?

Guarded Suspension 模式是通过让线程等待来保护实例的安全性,即守护-挂起模式,也常被称作 Guarded Wait 模式、Spin Lock 模式(因为使用了 while 循环去等待),它还有一个更形象的非官方名字:多线程版本的 if。

从哪儿来

在多线程开发中,常常为了提高应用程序的并发性,会将一个任务分解为多个子任务交给多个线程并行执行,而多个线程之间相互协作时,仍然会存在一个线程需要等待另外的线程完成后继续下一步操作。而Guarded Suspension模式可以帮助我们解决上述的等待问题。Guarded Suspension 模式允许多个线程对实例资源进行访问,但是实例资源需要对资源的分配做出管理。


应用场景

  • 多线程环境下多个线程访问相同实例资源,从实例资源中获得资源并处理;
  • 实例资源需要管理自身拥有的资源,并对请求线程的请求作出允许与否的判断;

样例

/**
 * @author yang
 * @version 1.0.0
 */
public class GuardedObject {
   
    private Object guardedData;
    public synchronized Object get() {
   
        while (guardedData == null) {
   
            try {
   
                wait(); // 如果条件没有被满足,则挂起当前线程
            } catch (InterruptedException e) {
   
                Thread.currentThread().interrupt();
            }
        }
        Object data = guardedData;
        guardedData = null; // 重置条件
        return data;
    }
    public synchronized void set(Object data) {
   
        guardedData = data;
        notifyAll(); // 唤醒所有被挂起的线程
    }

    public static void main(String[] args) {
   
        GuardedObject guardedObject = new GuardedObject();
        // 线程1:设置 guardedObject 的值
        new Thread(() -> {
   
            System.out.println("线程一没存值");
            try {
   
                Thread.sleep(10000);
            } catch (InterruptedException e) {
   
                throw new RuntimeException(e);
            }
            guardedObject.set("小阳吃饱了");
            System.out.println("线程一存值了");
        }).start();
        // 线程2:获取 guardedObject 的值
        new Thread(() -> {
   
            System.out.println("等待线程一存值");
            Object data = guardedObject.get();
            System.out.println("线程二拿到了线程一存的值: " + data);
        }).start();
    }


}

相关推荐

  1. 设计模式线分工模式--- 生产-消费者模式

    2024-01-16 20:08:02       65 阅读
  2. 设计模式线分工模式---Worker Thread模式

    2024-01-16 20:08:02       66 阅读
  3. 设计模式线分工模式--- Thread-Per-Message模式

    2024-01-16 20:08:02       58 阅读
  4. 线线安全单例模式

    2024-01-16 20:08:02       26 阅读
  5. 线上下文设计模式

    2024-01-16 20:08:02       54 阅读
  6. C++面试线池、智能指针、设计模式

    2024-01-16 20:08:02       49 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-16 20:08:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-16 20:08:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-01-16 20:08:02       87 阅读
  4. Python语言-面向对象

    2024-01-16 20:08:02       96 阅读

热门阅读

  1. 设计模式复盘

    2024-01-16 20:08:02       54 阅读
  2. yolov5s.yaml 文件解读

    2024-01-16 20:08:02       48 阅读
  3. cookie、Web Storage

    2024-01-16 20:08:02       50 阅读
  4. Python字符串

    2024-01-16 20:08:02       53 阅读
  5. Linux———chown命令和chgrp命令详解

    2024-01-16 20:08:02       49 阅读
  6. mysql日期时间函数

    2024-01-16 20:08:02       52 阅读
  7. [Linux]查看虚拟内存占用情况

    2024-01-16 20:08:02       58 阅读
  8. SpringBoot 基础介绍以及相关可实现的功能思路

    2024-01-16 20:08:02       52 阅读