创建对已作为成员字段保存的静态 volatile 变量的本地引用的目的或价值是什么。这里的代码来自 java.util.Scanner JDK 6b14 here。
class Scanner {
private static volatile Pattern linePattern;
...
private static Pattern linePattern() {
Pattern lp = linePattern;
if (lp == null)
linePattern = lp = Pattern.compile("...");
return lp;
}
...
}
Java 教程:“对于声明为 volatile 的所有变量(包括 long 和 double 变量),读取和写入都是原子的……对 volatile 变量的任何写入都会与随后读取同一变量建立起先发生关系。”
这意味着读取对 Pattern 对象的引用不会因为它已经改变而中途失败。volatile 关键字应该准确地保护这些类型的访问,所以我不打算复制局部变量来确保返回有效值。
此外,可以在成员字段上完成延迟初始化,而无需中间局部变量:
if (linePattern == null) linePattern = Pattern.compile("...");
它看起来是这里和这里看到的字节码优化。使用局部变量会产生更小的字节码(更少的指令)以及对实际值的更少访问(这是一种昂贵的易失性读取)。但是他们并没有同时使用最终变量优化,所以我对得出这个结论持怀疑态度。