En ArrayBlockingQueue
, todos los métodos que requieren el bloqueo lo copian en una variable local final
antes de llamar al lock()
.En ArrayBlockingQueue, ¿por qué copiar el campo miembro final en la variable final local?
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();
}
}
¿Hay alguna razón para copiar this.lock
a una variable local lock
cuando el campo es this.lock
final
?
Además, también se utiliza una copia local de E[]
antes de actuar sobre ella:
private E extract() {
final E[] items = this.items;
E x = items[takeIndex];
items[takeIndex] = null;
takeIndex = inc(takeIndex);
--count;
notFull.signal();
return x;
}
¿Hay alguna razón para copiar un campo final a una última variable local?
fuerte énfasis en la "extrema"! Esta no es una buena práctica de programación de propósito general que todos deberían emular. –
FYI aleatorio: en otros casos, cuando ve esto hecho, es porque el campo en cuestión es volátil, y el método necesita asegurarse de que tenga un solo valor consistente o referencia para él en todo momento. –
Tomaré esta optimización "extrema" en una clase básica como esta. –