31 | Guarded Suspension模式:等待唤醒机制的规范实现
该思维导图由 AI 生成,仅供参考
- 深入了解
- 翻译
- 解释
- 总结
Guarded Suspension模式是一种规范实现的等待唤醒机制,旨在解决异步操作中的等待唤醒问题。文章以Web项目中等待消息队列(MQ)返回结果的场景为例,引入Guarded Suspension模式,类比大堂经理协调就餐的情景,通过GuardedObject对象的get()和onChanged()方法实现了等待和唤醒的功能。进一步扩展了Guarded Suspension模式,引入Map来维护MQ消息id和GuardedObject对象实例的关系,更方便地解决了等待MQ返回消息的问题。通过示例代码展示了如何利用扩展后的GuardedObject来解决实际问题。总的来说,Guarded Suspension模式提供了一种规范的解决方案,能够有效地解决异步操作中的等待唤醒问题。 Guarded Suspension模式本质上是一种等待唤醒机制的规范实现,规范化的好处在于无需重头思考如何实现,也能避免一不小心写出Bug。在解决实际问题时,往往需要对其进行扩展,可以对GuardedObject的功能进行增强,或创建新的类来实现扩展。Guarded Suspension模式也常被称作Guarded Wait模式、Spin Lock模式,甚至有一个更形象的非官方名字:多线程版本的if。文章还引发了关于使用done.await()加锁和直接使用sleep()方法的讨论,探讨了不同实现方式的优劣。 文章内容涵盖了Guarded Suspension模式的基本原理、扩展方法以及实际应用,对读者快速了解该模式具有重要意义。
《Java 并发编程实战》,新⼈⾸单¥59
全部留言(66)
- 最新
- 精选
- 一道阳光当从消息队列接收消息失败时,while循环会一直执行下去,永远不会结束,回占用大量资源。
作者回复: 👍
2019-05-091063 - Felix Envy老师,感觉如果有方法调用了GuardedObect.create方法但是没有任何其他线程调用fireEvent方法会造成内存泄漏啊,这种情况需要考虑吗?
作者回复: 👍 需要,等待超时后要把他移除。
2019-05-12249 - zhangwei老师,我有个疑问,希望帮忙解答。如果Web应用是集群的,A节点处理HTTP请求后发了MQ,B节点的onMessage消费了回执消息,那么A节点怎么把结果响应给客户端呢?疑问好久了,希望老师给个思路,谢谢!
作者回复: 我了解有人是这么做的:把回执消息放到redis的list中,按照ip重新分组之后从redis中再次消费。 也可以按照ip建立不同的topic。
2019-05-181440 - Mr.Brooks没有锁也无法保证内存可见性吧
作者回复: 👍
2019-05-10225 - 朵朵集团总裁如果mq服务挂了无法消费,会引起web请求服务很多线程出于等待状态,是不是应该whlie循环加上超时。
作者回复: 总裁您说的对👍
2020-04-0110 - 张三接入微信支付支付宝支付里边,也需要提供一个回调函数,onChange()就是一个回调函数吧,不过微信支付宝支付是异步回调,是不是也可以改成这种?微信支付宝里边的其它第三方支付是不是就是这种模式,因为支付成功之后跳转到它们自己的页面,而不是微信支付宝官方的支付成功界面
作者回复: 这个回调函数和mq的回调函数从服务接入方的角度看是一样的
2019-05-109 - 飞翔老师 future.get 就是guarded suspension 的应用吧
作者回复: 是的👍
2019-09-2437 - 君哥聊技术如果以文中的最后一段示例代码来看,每一个请求生成一个id,对应一个GuardedObject,并没有线程安全问题。我觉得可以去掉锁。 但是加sleep的话,没有办法唤醒,只能等到超时。
作者回复: await和notify获取锁才能调用,所以不能去掉锁
2019-05-097 - 庄墨寒老师, 我觉得您只是举个例子吧. 真实的生成环境, A和B肯定都是一个集群; A 给 B发一个消息. B处理完后再给A发一个消息, 在A 集群中发送和接收消息的大概率两台不同的机器. 解决这个问题两种办法: 1. web 请求长轮询; 2. A集群有分布式的缓存, A的某台机器处理消息后把结果写到缓存, 处理web请求的机器有专门的线程去轮询.
作者回复: 这是个真实的例子,集群中有两台机器,a->b有一个参数topic,b->a的时候根据传入的topic参数来确定写入哪个topic的,两台机器的topic参数不同,所以发送和接收是能对应上的
2019-09-066 - ipofss老师,这节听了个大概,不是非常懂。其中有一点没理解,get方法加锁后,while判断一直都为true,也就一直不会释放锁,那onChanged方法进去之后,获取不到锁,双方不久互相死等下去了么,我应该还是哪里没想明白
作者回复: wait会释放锁,建议重看第一部分管程相关的内容
2019-10-305