成员变量的局部变量的目的是什么?



当我看到一些像dubbo这样的框架源代码时,我经常看到类似于以下内容的代码:

public class Person {
int age;
String name;
List<Person> persons = new ArrayList<Person>();
public Person findPerson(int lowAge,int highAge){
List<Person> localPersons = persons;
for(Person p : localPersons){
if( p.age >=lowAge && p.age <highAge){
return p;
} 
}
return null;
}
}

我只是不明白为什么不直接使用成员变量人。局部变量本地人对我来说看起来是多余的。

这可能是一个微优化,尽管我怀疑它是否会与现代JVM有任何不同。 (如果这是一个值得的优化,JIT 编译器的优化器可能会在本机代码级别执行等效转换。

如果有多个线程,也可能是(不正确的)尝试使代码工作。 我说"不正确"是因为程序员忽略了Java内存模型的要求。 由于在访问persons变量或其引用的列表的两个线程之间的关系之前没有明确发生,因此线程很容易看到过时的数据,从而导致不可预测的行为。

这样做可能还有其他原因在您的示例中并不明显。 (例如,如果persons被声明为volatile并且满足某些其他先决条件,这可能是线程安全的,并且假定的冗余局部变量可能具有有效目的。

相关内容

最新更新