创建对已作为成员字段保留的静态易失性变量的本地引用的目的或价值是什么。这里的代码来自java.util.Scanner JDK6b14 here。
class Scanner {
private static volatile Pattern linePattern;
...
private static Pattern linePattern() {
Pattern lp = linePattern;
if (lp == null)
linePattern = lp = Pattern.compile("...");
return lp;
}
...
}The Java Tutorials:“对于声明为易失性的所有变量(包括长变量和双变量),读写都是原子的……对易失性变量的任何写入都会与随后对该变量的读取建立一种发生在此之前的关系。”
这意味着读取对Pattern对象的引用不会半途而废,因为它已经更改了。volatile关键字应该保护这些类型的访问,所以我不认为复制局部变量是为了确保返回一个有效的值。
此外,懒惰初始化可以在成员字段上完成,而不需要中间局部变量:
if (linePattern == null) linePattern = Pattern.compile("...");正如here和here所见,它看起来是一个字节码优化。使用局部变量会产生更小的字节码(更少的指令)以及更少的对实际值的访问(这是一种昂贵的易失性读取)。然而,他们并没有使用最终的变量优化,所以我对得出这个结论持怀疑态度。
发布于 2013-02-03 06:50:13
这“加速”了事情。访问volatile变量的开销很大。用户可以通过将其分配给堆栈变量并访问该变量来避免此开销
发布于 2013-02-03 05:04:06
Lazy initialization,即把工作推迟到真正需要的时候。
发布于 2013-02-03 05:13:32
它保证返回值不为NULL -即使在检查和返回之间将静态变量设置为NULL。
同时,它是一个不同步的惰性初始化,如果需要,可以重新初始化;)。
https://stackoverflow.com/questions/14666479
复制相似问题