设计模式之避免共享的设计模式Immutability(不变性)模式
设计模式之并发特定场景下的设计模式 Two-phase Termination(两阶段终止)模式
设计模式之避免共享的设计模式Copy-on-Write模式
设计模式之避免共享的设计模式 Thread-Specific Storage 模式
提示:以下是本篇文章正文内容,下面案例可供参考
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();
}
}