本文主要是介绍设计模式之多线程版本的if------Guarded Suspension模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
系列文章目录
设计模式之避免共享的设计模式Immutability(不变性)模式
设计模式之并发特定场景下的设计模式 Two-phase Termination(两阶段终止)模式
设计模式之避免共享的设计模式Copy-on-Write模式
设计模式之避免共享的设计模式 Thread-Specific Storage 模式
文章目录
- 系列文章目录
- Guarded Suspension是什么?
- 从哪儿来
- 应用场景
- 样例
提示:以下是本篇文章正文内容,下面案例可供参考
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();}}
这篇关于设计模式之多线程版本的if------Guarded Suspension模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!