当我在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;
}
答案 0 :(得分:0)
它避免重新读取实例字段。编译器/ JIT可能会或可能不会优化您建议的样式或者根本不会 - 我们通常不会采取这样的机会。此外,该模式可能会出现volatile
字段,重新读取可能会很昂贵,并且每次都可能产生不同的值,从而使代码的意图无效。
(另请不要打开问题/ PR尝试更改此模式,因为它将被拒绝。)