图示Android系统原理之Handler同步屏障(二)

657 阅读3分钟

目录

Handler同步屏障(一):同步屏障是什么

Handler同步屏障(二):同步屏障的执行流程

Handler同步屏障(三):系统对同步屏障的应用

Handler同步屏障(四):业务对同步屏障的应用

上节问题解答

  1. 如何插入屏障消息? 答:Demo工程中详细演示了插入屏障消息的方式。插入和移除屏障消息的方法属于私有访问权限的Api,所以使用了反射技术调用。

  2. 可以插入多个屏障消息吗? 答:可以。

  3. 逐个插入多个屏障消息时,然后再逐个移除屏障消息后消息队列的变化情况是什么样的? 继续阅读下面详细的执行流程图示可以得到答案。

同步屏障的执行流程

消息插入顺序概览

执行流程动态演示

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. 移除全部屏障消息

移除全部屏障消息后,同步消息全部被消费掉

执行流程答疑

  1. 在第6步的描述中提到一个细节,插入同步消息C后,是被屏障消息A挡住,而不是屏障消息B,原因如下: 答:系统在获取消息队列中的消息时,遇到屏障消息后,消息队列的头部指针并不会向后移动,而是会保持在原地,然后向后遍历寻找异步消息进行消费处理,所以当存在多个屏障消息时,后面的同步消息是被队列头部的屏障消息挡住,而不是后面的屏障消息。

下节预告

  1. 同步屏障技术产生的背景是什么?

  2. 系统加入同步屏障技术的原因是什么?

  3. 系统哪部分功能采用了同步屏障技术实现?