拿HashMap的keySet()方法举例:
public Set<K> keySet() {
Set<K> ks = keySet;
if (ks == null) {
ks = new KeySet();
keySet = ks;
}
return ks;
}
写成如下形式岂不是更简洁?
public Set<K> keySet() {
if(keySet == null) {
keySet = new KeySet();
}
return keySet;
}
public Set<K> keySet() {
return keySet == null ? (keyset = new KeySet()) : keySet;
}
作者有其他用意吗?
这个跟 keySet 被 volatile 修饰有关。
1 本地变量可以防止共享变量被意外修改。
2 使用本地变量可以减少对 volatile 变量的读取次数,JVM 可以优化代码的执行。
可以参考这个 https://stackoverflow.com/que...
如果不考虑 volatile,应该就是为了防止判过 keySet 空之后,别的线程把 keySet 设置成 null,结果返回了 null。