You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Observable.notifyObservers()会反向通知观察者?

为什么Java的Observable.notifyObservers从数组末尾遍历通知订阅者?

我发现Observable.notifyObservers会优先通知最新订阅的对象,而非较早订阅的,查看源码后发现它是从数组末尾开始遍历的:

public void notifyObservers(Object arg) {
    Object[] arrLocal;
    synchronized (this) {
        if (!changed)
            return;
        arrLocal = obs.toArray();
        clearChanged();
    }

    for (int i = arrLocal.length-1; i>=0; i--)
        ((Observer)arrLocal[i]).update(this, arg);
}

这个逆序遍历的设计主要有两个核心原因:

  • 避免订阅者在通知过程中修改列表导致的遍历异常
    虽然当前版本的代码会先把订阅者列表拷贝到arrLocal再遍历,修改原列表不会影响本次通知,但早期的Observable实现可能没有这个拷贝逻辑。逆序遍历的设计可以规避正序遍历的一个常见问题:如果某个订阅者在update方法中执行取消订阅操作,正序遍历会导致后续元素的索引偏移,可能跳过部分订阅者;而逆序遍历则不会出现这个问题,因为已经遍历过的是列表末尾的元素,前面的元素修改不会影响未遍历的部分。这个设计习惯被保留到了后续版本中。

  • 满足“最新订阅者优先响应”的业务场景需求
    在很多实际场景中,最新添加的观察者往往是临时注册的(比如调试用的观察者、动态触发的业务逻辑观察者),它们对当前的状态变化敏感度更高。优先通知这类订阅者,可以让关键逻辑第一时间响应事件,符合实际开发中的优先级需求。

内容的提问来源于stack exchange,提问作者Kassab

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 22:20:41