In ArrayBlockingQueue
, tutti i metodi che richiedono il blocco lo copiano in una variabile locale final
prima di chiamare lock()
.In ArrayBlockingQueue, perché copiare il campo membro finale nella variabile finale locale?
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();
}
}
C'è qualche motivo per copiare this.lock
a una variabile locale lock
quando il campo è this.lock
final
?
Inoltre, utilizza anche una copia locale di E[]
prima di agire su di esso:
private E extract() {
final E[] items = this.items;
E x = items[takeIndex];
items[takeIndex] = null;
takeIndex = inc(takeIndex);
--count;
notFull.signal();
return x;
}
C'è qualche motivo per la copia di un campo finale a una variabile finale locale?
forte accento sulla "estreme"! Questa non è una buona pratica di programmazione generale che tutti dovrebbero emulare. –
FYI casuale: in alcuni altri casi quando si vede questo fatto, è perché il campo in questione è volatile, e il metodo deve assicurarsi che abbia un singolo valore coerente o riferimento per tutto questo. –
Prenderò questa ottimizzazione "estrema" in una classe di base come questa. –