当我看到一些框架源代码(例如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;
}
}
Run Code Online (Sandbox Code Playgroud)
我只是不明白为什么不直接使用成员变量person。局部变量localPersons对我来说似乎很多余。
这可能是微优化,尽管我怀疑这对现代JVM是否会有所作为。(如果这是一个值得的优化,那么JIT编译器的优化器可能会在本机代码级别进行等效的转换。)
如果有多个线程,也可能(不正确)尝试使代码正常工作。我说“不正确”是因为程序员忽略了Java内存模型的要求。由于在访问变量或它所引用的列表的两个线程之间的关系之前没有明确的事情发生persons,因此线程很容易看到陈旧的数据,从而导致不可预测的行为。
有可能是没有明显的在你的榜样等原因这样做。(例如,如果persons声明为,volatile并且满足某些其他前提条件,则这可能是线程安全的,并且所谓的冗余局部变量可能具有有效的用途。)