目录
上节问题解答
-
如何插入屏障消息? 答:Demo工程中详细演示了插入屏障消息的方式。插入和移除屏障消息的方法属于私有访问权限的Api,所以使用了反射技术调用。
-
可以插入多个屏障消息吗? 答:可以。
-
逐个插入多个屏障消息时,然后再逐个移除屏障消息后消息队列的变化情况是什么样的? 继续阅读下面详细的执行流程图示可以得到答案。
同步屏障的执行流程
消息插入顺序概览
执行流程动态演示
1. 插入同步消息A后
同步消息A直接被消费掉,所以消息队列为空
2. 插入屏障消息A后
屏障消息只能被手动移除,所以插入后仍在消息队列中
3. 插入同步消息B
同步消息B被屏障消息A挡住,所以插入后仍在消息队列中
4. 插入异步消息A
屏障消息A无法挡住异步消息,所以异步消息A进入消息队列后直接被消费掉
5. 插入屏障消息B
屏障消息只能被手动移除,所以插入后仍在消息队列中
6. 插入同步消息C
同步消息C被屏障消息A挡住,所以插入后仍在消息队列中
7. 插入异步消息B
屏障消息A无法挡住异步消息,所以异步消息B被直接消费掉
8. 只移除屏障消息A
只移除屏障消息A后,同步消息B直接被消费掉,同步消息C此时被屏障消息B挡住
9. 只移除屏障消息B
只移除屏障消息B后,由于屏障消息A仍在消息队列中挡住其后的所有同步消息,所以同步消息B和同步消息C仍被挡在消息队列中
10. 移除全部屏障消息
移除全部屏障消息后,同步消息全部被消费掉
执行流程答疑
- 在第6步的描述中提到一个细节,插入同步消息C后,是被屏障消息A挡住,而不是屏障消息B,原因如下: 答:系统在获取消息队列中的消息时,遇到屏障消息后,消息队列的头部指针并不会向后移动,而是会保持在原地,然后向后遍历寻找异步消息进行消费处理,所以当存在多个屏障消息时,后面的同步消息是被队列头部的屏障消息挡住,而不是后面的屏障消息。
下节预告
-
同步屏障技术产生的背景是什么?
-
系统加入同步屏障技术的原因是什么?
-
系统哪部分功能采用了同步屏障技术实现?