是否有必要在RxJava中设置“资源”

时间:2017-04-19 09:38:07

标签: rx-java

当我在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;
    }

1 个答案:

答案 0 :(得分:0)

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

(另请不要打开问题/ PR尝试更改此模式,因为它将被拒绝。)