Costo de usar campos finales
Sabemos que hacer que los campos sean finales suele ser una buena idea, ya que obtenemos seguridad de los hilos e inmutabilidad, lo que hace que el código sea más fácil de razonar. Tengo curiosidad si hay un costo de rendimiento asociado.
El modelo de memoria Java garantiza estofinal Field Semantics
:
Se garantiza que un subproceso que solo puede ver una referencia a un objeto después de que ese objeto se haya inicializado por completo para ver los valores correctamente inicializados para los campos finales de ese objeto.
Esto significa que para una clase como esta
class X {
X(int a) {
this.a = a;
}
final int a;
static X instance;
}
cada vez que el hilo 1 crea una instancia como esta
X.instance = new X(43);
while (true) doSomethingEventuallyEvictingCache();
y el hilo 2 lo ve
while (X.instance == null) {
doSomethingEventuallyEvictingCache();
}
System.out.println(X.instance.a);
debe imprimir 43. Sin elfinal
modificador, el JIT o la CPU podrían reordenar las tiendas (primera tiendaX.instance
y luego establecera=43
) y el subproceso 2 podrían ver el valor inicializado por defecto e imprimir 0 en su lugar.
Cuando JIT vefinal
obviamente se abstiene de reordenar. Pero también tiene que obligar a la CPU a obedecer la orden. ¿Hay una penalización de rendimiento asociada?