gpt4 book ai didi

java - 使用 final 字段的成本

转载 作者:IT老高 更新时间:2023-10-28 21:02:29 26 4
gpt4 key购买 nike

我们知道将字段设为 final 通常是一个好主意,因为我们获得了线程安全性和不变性,这使得代码更易于推理。我很好奇是否有相关的性能成本。

Java 内存模型保证 final Field Semantics :

A thread that can only see a reference to an object after that object has been completely initialized is guaranteed to see the correctly initialized values for that object's final fields.

这意味着对于这样的类

class X {
X(int a) {
this.a = a;
}
final int a;

static X instance;
}

每当线程 1 创建这样的实例时

X.instance = new X(43);
while (true) doSomethingEventuallyEvictingCache();

线程 2 看到了它

 while (X.instance == null) {
doSomethingEventuallyEvictingCache();
}
System.out.println(X.instance.a);

它必须打印 43。没有 final 修饰符,JIT 或 CPU 可以重新排序存储(首先存储 X.instance 然后设置 a= 43) 和线程 2 可以看到默认初始化值并打印 0。

当 JIT 看到 final 时,它显然会避免重新排序。但它也必须强制 CPU 服从命令。是否存在相关的性能损失?

最佳答案

Is there an associated performance penalty?

如果您查看 JIT 编译器的源代码,您会在文件 src/share/vm/opto/parse1.cpp 中找到以下关于最终成员变量的注释。 :

This method (which must be a constructor by the rules of Java) wrote a final. The effects of all initializations must be committed to memory before any code after the constructor publishes the reference to the newly constructor object. Rather than wait for the publication, we simply block the writes here. Rather than put a barrier on only those writes which are required to complete, we force all writes to complete.

如果有 final 成员变量,编译器会发出额外的指令。最有可能的是,这些附加指令会导致性能损失。但目前尚不清楚这种影响是否对任何应用程序都很重要。

关于java - 使用 final 字段的成本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23527252/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com