studio programacion móviles español desarrollo desarrollar curso con aprende aplicaciones java

java - programacion - ¿Por qué no usa el campo de instancia directamente, pero lo asigna a una variable local?



manual programacion android español pdf (3)

¿Más vale prevenir que curar?

Supongo que, al escribir bibliotecas fundamentales, es mejor que busque la solución más segura, si es lo suficientemente barata. Y este es extremadamente barato.

  • Con respecto al rendimiento, una variable local debe ser más rápida que un acceso de campo. Supongo que cualquier JVM que valga su nombre hará una optimización tan trivial (*), pero ¿qué pasa con el código interpretado y posiblemente con C1 (el primer compilador, rápido y de baja calidad en Oracle JVM)? No hará mucha diferencia, pero los microsegundos guardados cuentan para millones de usuarios. ¿Qué pasa con Java que se ejecuta en plataformas exóticas con una JVM aún por escribir ...

  • La final no es exactamente final en la realidad. El campo puede cambiarse mediante la reflexión. No puedo imaginar ninguna razón para hacer esto y cualquiera que haga cosas tan graciosas obtiene lo que merece. La depuración de OTOH de tales problemas puede llevar días y la programación a prueba de tontos es un buen hábito al escribir cosas tan fundamentales.

(*) Creo haber leído un artículo de alguien con reputación que dice lo contrario, pero no puedo encontrarlo ahora.

Estoy leyendo la fuente de java.util.concurrent.ArrayBlockingQueue , y encontré un código que no entiendo:

private final ReentrantLock lock; public boolean offer(E e) { if (e == null) throw new NullPointerException(); final ReentrantLock lock = this.lock; lock.lock(); try { if (count == items.length) return false; else { insert(e); return true; } } finally { lock.unlock(); } }

Note esta línea:

final ReentrantLock lock = this.lock;

¿Por qué no usa this.lock directamente, pero lo asigna a una variable local?


¿Podría ser para fines de optimización ?

Posiblemente una variable local podría asignarse más fácilmente a un registro con un compilador JIT.

Al menos en Android, para las primeras versiones de la API, acceder a una variable local era más barato que acceder a una variable de instancia (no se puede hablar de las versiones más recientes). Podría ser que Java simple sea el mismo, y en algunos casos tiene sentido usar un local.

En realidad, encontré un hilo confirmando esto aquí . Extraer:

Es un estilo de codificación popularizado por Doug Lea. Es una optimización extrema que probablemente no sea necesaria; puede esperar que el JIT realice las mismas optimizaciones. (¡puede intentar verificar el código de la máquina por sí mismo!) Sin embargo, copiar a los locales produce el código de bytec más pequeño, y para el código de bajo nivel es bueno escribir código que esté un poco más cerca de la máquina.


Ya que solo se está copiando la referencia y el bloqueo está en el Objeto en su lugar, y el Objeto es el mismo, no debería importar.

El bloqueo de la variable de instancia también se declara final, así que realmente, no veo ningún punto en hacer una copia de referencia.

Como señaló JRL es una optimización, pero en realidad es una microoptimización tan pequeña, que todavía no veo mucho sentido en hacerlo, especialmente para una sola lectura.