这些都是根据我最近看的《Java实战指南多线程编程(设计模式篇)》所得整理。
模式名称
Guarded Suspension(保护性暂挂模式)
模式面对的问题
多线程编程中,往往将一个任务分解为不同的部分,将其交由不同的线程来执行,这些线程相互协作的时候,会出现一个线程等待另一个线程一定操作过后才能进行的情景,这个时候就需要这个线程退出执行。
解决方法
有一个类GuardedObject包含受保护方法的对象,存放被保护对象的方法和被保护对象的唤醒方法。一个类GuardedAction抽象目标动作,并关联了目标动作锁需的保护条件.一个ConcreteGuardedAction应用程序锁体现的具体目标动作及其关联的保护条件,一个Predicate抽象保护条件,ConCretePredicate应用程序锁实现的具体保护条件,Blocker负责执行受保护的方法所在线程的挂起和唤醒。并执行ConcreteGuardedAction锁执行的目标操作。ConditionVarBlocker给予Java条件变量实现的Blocker.
例子代码
这也是书上的代码,需求是:某系统有个告警功能模块,改模块的主要功能是将其接收到的告警信息发送给告警服务器。
AlarmAgent类
public class ALarmAgent {
//用于记录AlarmAgent
private volatile boolean connectedToServer = false;
//模式角色:GuardedSuspension.Predicate
private final Predicate agentConnected = new Predicate(){
@Override
public boolean evaluate(){
return connectedToServer;
}
};
//模式角色GuaededSuspension.Blocker
private final Blocker blocker = new ConditionVarBlocker();
//心跳定时器
private final Timer heartbeatTimer = new Timer(true);
//发送告警信息
public void sendAlarm(final AlarmInfo alarm) throws Exception {
GuardedAction<Void> guardedAction = new GuardedAction<Void&g

保护性暂挂模式用于解决多线程编程中线程间的协作问题,其中一个线程需要等待其他线程完成特定操作后才能继续执行。模式通过GuardedObject、GuardedAction、ConcreteGuardedAction、Predicate和Blocker等组件实现,确保线程安全和正确同步。《Java实战指南多线程编程》中给出了具体的例子,例如告警功能模块,其sendAlarm方法的执行需要在满足特定条件后才进行。然而,该模式需要注意内存可见性、锁泄露、线程提前唤醒和潜在的死锁风险。
3万+

被折叠的 条评论
为什么被折叠?



