Dans ArrayBlockingQueue
, toutes les méthodes nécessitant le verrouillage le copient dans une variable locale final
avant d'appeler lock()
.Dans ArrayBlockingQueue, pourquoi copier le champ du membre final dans la variable 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();
}
}
Y at-il raison de copier this.lock
à une variable locale lock
lorsque le champ this.lock
est final
?
De plus, il utilise également une copie locale de E[]
avant d'agir sur elle:
private E extract() {
final E[] items = this.items;
E x = items[takeIndex];
items[takeIndex] = null;
takeIndex = inc(takeIndex);
--count;
notFull.signal();
return x;
}
Y at-il raison de la copie d'un champ final à une variable finale locale?
accent sur « extrême »! Ce n'est pas une bonne pratique de programmation générale que tout le monde devrait imiter. –
FYI aléatoire: dans certains autres cas, lorsque vous voyez ceci, c'est parce que le champ en question est volatile, et la méthode doit s'assurer qu'il y a une seule valeur cohérente ou une référence pour cela. –
Je vais prendre cette optimisation "extrême" dans une classe de base comme celle-ci. –