读《图解多线程设计模式》之Guarded Suspension

Guarded Suspension模式

                                 - -如果执行现在的处理会出现问题,那么就让执行处理的线程进行等待

1、守护条件(前置条件)是什么?

在执行目标处理前必须满足的条件称之为守护(前置)条件

2、该模式登场的角色

GuardedObject:被守护的对象,持有一个被守护的方法guardedMethod,当线程执行该方法时,若守护条件成立,则立即执行,否则就要进行等待。guardedMethod通过while和wait()实现,而状态改变方法则通过notify/notifyAll来实现

 

上图中的意思是:如果队列中存在请求,就执行remove()获取请求,没有请求则持续陷入等待状态。知道通过下图改变队列状态

 

3、该模式的特点:①存在循环②存在条件检查③因为某种原因而“等待”

4、如果忘记唤醒了怎么办?设置超时时间。

5、该模式和自旋锁的机制有异曲同工之妙

6、最佳实践 BlockingQueue阻塞队列

   public Request getRequest() {
        Request req = null;
        try {
            req = queue.take();
        } catch (InterruptedException e) {
        }
        return req;
    }

    public void putRequest(Request request) {
        try {
            queue.put(request);
        } catch (InterruptedException e) {
        }
    }

put方法加入请求,take方法内部实现,非常精妙

 public E takeFirst() throws InterruptedException {
        final ReentrantLock lock = this.lock;
        lock.lock();
        try {
            E x;
            while ( (x = unlinkFirst()) == null)
                notEmpty.await();
            return x;
        } finally {
            lock.unlock();
        }
    }

应用场景参考

https://blog.csdn.net/luzhensmart/article/details/81712583

https://cloud.tencent.com/developer/article/1636024

https://www.jianshu.com/p/8503349b27f4

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值