2012-04-16 1 views
3

В Java JRE я видел the codeПочему замок захвачен локальной переменной

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

Почему замок захватил в приватной переменной? Я бы ожидал просто

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

Дубликат http://stackoverflow.com/questions/2785964/in-arrayblockingqueue-why-copy-final-member-field-into-local-final-variable –

+0

Я бы сказал, что это не имеет смысла, но Дуг Ли сделал это в нескольких методах класса, который вы упомянули, поэтому должна быть причина. Мне любопытно, что ответ - хороший вопрос. –

ответ

0

Прежде всего, чтобы обеспечить максимальную производительность. Хотя это настоящая микро-оптимизация, вероятно, это код, чувствительный к производительности, и вы также можете это сделать.

Вы также должны быть очень осторожно, чтобы ссылка на блокировку, которую вы используете, не мутирует. Конечно, сделайте поле final, но локальная ссылка на локальную ссылку final.

+0

Что он оптимизирует? получает доступ к последнему участнику класса медленнее, чем локальный конечный участник? –

+0

@EugeneRetunsky, если вы посмотрите на дубликат сообщения и то, что он цитирует: «копирование на местных жителей производит самый маленький байт-код» – trutheality

+0

Да, но это действительно микроскопично. И с точки зрения производительности вы не заметите, что даже на уровне наносекунд, я считаю. Особенно это касается блокировки/разблокировки. Кроме того, он сохраняет только ОДИН доступ к полю и делает код менее понятным с не заметным результатом производительности. –