Tag: memory fences

使用最终字段的成本

我们知道最终制作字段通常是一个好主意,因为我们获得了线程安全性和不变性,这使代码更易于推理。 我很好奇是否有相关的性能成本。 Java内存模型保证了final Field Semantics : 在该对象完全初始化之后只能看到对象引用的线程可以保证看到该对象的最终字段的正确初始化值。 这意味着对于像这样的类 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遵守命令。 是否存在相关的性能损失?