首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于访问易失性实例变量的局部变量

用于访问易失性实例变量的局部变量
EN

Stack Overflow用户
提问于 2013-02-03 05:01:27
回答 4查看 1.1K关注 0票数 0

创建对已作为成员字段保留的静态易失性变量的本地引用的目的或价值是什么。这里的代码来自java.util.Scanner JDK6b14 here

代码语言:javascript
复制
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关键字应该保护这些类型的访问,所以我不认为复制局部变量是为了确保返回一个有效的值。

此外,懒惰初始化可以在成员字段上完成,而不需要中间局部变量:

代码语言:javascript
复制
if (linePattern == null) linePattern = Pattern.compile("...");

正如herehere所见,它看起来是一个字节码优化。使用局部变量会产生更小的字节码(更少的指令)以及更少的对实际值的访问(这是一种昂贵的易失性读取)。然而,他们并没有使用最终的变量优化,所以我对得出这个结论持怀疑态度。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-02-03 06:50:13

这“加速”了事情。访问volatile变量的开销很大。用户可以通过将其分配给堆栈变量并访问该变量来避免此开销

票数 1
EN

Stack Overflow用户

发布于 2013-02-03 05:04:06

Lazy initialization,即把工作推迟到真正需要的时候。

票数 2
EN

Stack Overflow用户

发布于 2013-02-03 05:13:32

它保证返回值不为NULL -即使在检查和返回之间将静态变量设置为NULL。

同时,它是一个不同步的惰性初始化,如果需要,可以重新初始化;)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14666479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档