多线程设计模式——Guarded Suspension(保护性暂挂模式)

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

这些都是根据我最近看的《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 {
        GuardedActio
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值