是否需要分配"resources"在 RxJava 中设置



我在读取rxjava中的源代码时感到困惑:是否有必要分配"资源"设置?

在类compositedisposable中rxjava中的代码:

 @Override
    public boolean add(Disposable d) {
        ObjectHelper.requireNonNull(d, "d is null");
        if (!disposed) {
            synchronized (this) {
                if (!disposed) {
                    **OpenHashSet<Disposable> set = resources;**
                    if (set == null) {
                        set = new OpenHashSet<Disposable>();
                        resources = set;
                    }
                    set.add(d);
                    return true;
                }
            }
        }
        d.dispose();
        return false;
    }

已修改的代码:

@Override
    public boolean add(Disposable d) {
        ObjectHelper.requireNonNull(d, "d is null");
        if (!disposed) {
            synchronized (this) {
                if (!disposed) {
                    OpenHashSet<Disposable> set = resources;
                    if (resources == null) {
                        resources = new OpenHashSet<Disposable>();
                    }
                    resources.add(d);
                    return true;
                }
            }
        }
        d.dispose();
        return false;
    }

它避免重新阅读实例字段。编译器/JIT可能会或可能不会及时优化您建议的样式 - 我们通常不会抓住这种机会。此外,该模式可能会出现在volatile字段中,该字段可能很昂贵,并且每次都可能产生不同的值,从而使代码的意图无效。

(也请不要打开问题/PR试图改变此模式,因为它将被拒绝。(

最新更新