我在读取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试图改变此模式,因为它将被拒绝。(