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

发布时间:2024年01月13日

系列文章目录

设计模式之避免共享的设计模式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();
    }


}

文章来源:https://blog.csdn.net/weixin_44859605/article/details/135570851
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。