请谈谈什么是同步屏障?

更多面试题请看这里:https://interview.raoyunsoft.com/

面试题专栏会持续更新欢迎关注订阅

同步屏障是Android消息机制中的一种特殊控制手段,用于临时阻塞同步消息 ,优先处理异步高优先级消息(如UI绘制)。它的核心作用是确保关键任务不被普通消息延迟执行。


一、工作原理

  1. 设置屏障

    调用 handler.getLooper().getQueue().postSyncBarrier() 插入一个 target 为 null 的特殊消息(屏障消息):

    java 复制代码
    // 伪代码实现
    Message barrier = Message.obtain();
    barrier.when = SystemClock.uptimeMillis();
    mQueue.enqueueMessage(barrier); // 屏障入队
  2. 消息处理优先级

    Looper.loop() 执行 queue.next() 时:

    • 遇到屏障消息(target=null)时,跳过所有同步消息
    • 只处理标记为异步的消息(通过 msg.setAsynchronous(true)
  3. 屏障移除

    任务完成后需手动移除屏障:

    java 复制代码
    mQueue.removeSyncBarrier(token); // token是添加屏障时的返回值

二、关键特性

特性 同步消息 异步消息
标记方式 默认状态 msg.setAsynchronous(true)
屏障下的处理 被阻塞 优先执行
典型应用场景 普通业务逻辑 UI绘制、VSync信号响应

三、核心应用场景

View绘制流程 中保证优先级:

java 复制代码
// ViewRootImpl.java
void scheduleTraversals() {
    if (!mTraversalScheduled) {
        mTraversalScheduled = true;
        // 1. 插入同步屏障
        mTraversalBarrier = mHandler.getLooper().getQueue().postSyncBarrier();
        // 2. 发送异步绘制消息
        mChoreographer.postCallback(
            Choreographer.CALLBACK_TRAVERSAL, 
            mTraversalRunnable, 
            null
        );
    }
}

设计意图:避免用户输入事件(同步消息)阻塞16ms内的UI渲染(异步消息),防止掉帧。


四、底层机制解析

  1. 消息队列结构

    屏障消息如同"闸门",后续同步消息被拦截

  2. next() 关键逻辑

    java 复制代码
    Message next() {
        for (;;) {
            if (msg != null && msg.target == null) {
                // 发现屏障,寻找异步消息
                do {
                    prevMsg = msg;
                    msg = msg.next;
                } while (msg != null && !msg.isAsynchronous());
            }
            return msg; // 只返回异步消息
        }
    }

五、开发者注意事项

  1. 慎用场景

    仅限系统级高优先级任务(如渲染、动画),滥用会导致普通消息饥饿

  2. 屏障必须移除

    未移除的屏障会造成同步消息永久阻塞:

    java 复制代码
    // 在Traversals执行后移除
    void unscheduleTraversals() {
        mHandler.getLooper().getQueue().removeSyncBarrier(mTraversalBarrier);
    }
  3. 替代方案

    现代开发推荐使用 Choreographer + Vsync 机制管理绘制时序,而非直接操作屏障。

相关推荐
程序员陆业聪23 分钟前
AI编码提效实战:Skill、Rule与上下文工程
android
程序员陆业聪1 小时前
AI驱动需求梳理与Spec编写:让PRD自动变成技术方案
android
李日灐2 小时前
<5> Linux 开发工具:包管理 + Vim 实操 + GCC 编译流程 + 静态与动态链接详解
linux·运维·服务器·面试·vim·gcc
李艺为3 小时前
Android Studio使用switch匹配资源id时报需要常量表达式解决办法
android
前端摸鱼匠3 小时前
【AI大模型春招面试题29】对比学习(Contrastive Learning)在大模型预训练中的应用?
人工智能·学习·算法·面试·大模型·求职招聘
其实防守也摸鱼4 小时前
面试常问问题总结--渗透测试工程师方向
网络·sql·面试·职场和发展·xss·工具·owasp
2501_913061344 小时前
网络原理知识(7)
java·网络·面试
前端摸鱼匠4 小时前
【AI大模型春招面试题26】大模型的“上下文窗口”(Context Window)是什么?长度对模型性能的影响?
人工智能·ai·面试·大模型·求职招聘
笨蛋不要掉眼泪4 小时前
面试篇-java基础下
java·后端·面试·职场和发展
YaBingSec4 小时前
玄机靶场-2024ccb初赛sc05 WP
android·运维·网络·笔记·安全·ssh