2012-04-16 5 views
3

En java je JRE vu the codePourquoi verrouillage capturé à une variable locale

private final ReentrantLock lock; 
public E poll() { 
     final ReentrantLock lock = this.lock; 
     lock.lock(); 

Pourquoi est capturé verrouillage à une variable privée? Je m'attendrais simplement

public E poll() { 
     lock.lock(); 
+4

Duplicata de http://stackoverflow.com/questions/2785964/in-arrayblockingqueue-why-copy-final-member-field-into-local-final-variable –

+0

Je dirais que cela n'a pas de sens, mais Doug Lea l'a fait dans plusieurs méthodes de la classe que vous avez mentionnée, il doit donc y avoir une raison. Je suis curieux de savoir quelle est la réponse - bonne question. –

Répondre

0

Principalement pour assurer une performance maximale. Bien qu'il s'agisse d'une véritable micro-optimisation, il s'agit probablement d'un code sensible aux performances, et vous pourriez tout aussi bien le faire.

Vous devez également être très attention que la référence de verrouillage que vous utilisez ne mute pas. Bien sûr, faites le champ final, mais en prenant une référence locale final est localement explicite.

+0

Qu'est-ce qu'il optimise? accède à un membre de la classe finale plus lentement qu'un membre final local? –

+0

@EugeneRetunsky si vous regardez le message en double et ce qu'il cite: "copier aux locaux produit le plus petit bytecode" – trutheality

+0

Oui, mais c'est vraiment microscopique. Et à partir du point de performance, vous ne remarquerez pas que - même au niveau des nanosecondes, je crois. Particulièrement par rapport au verrouillage/déverrouillage. En outre, il enregistre seulement un accès au champ et rend le code moins clair avec des résultats non perceptibles dans les performances. –

Questions connexes