В ArrayBlockingQueue
все методы, требующие блокировки, копируют его в локальную переменную final
перед вызовом lock()
.В ArrayBlockingQueue, зачем копировать конечное поле участника в локальную конечную переменную?
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();
}
}
Есть ли основания для копирования this.lock
локальной переменной lock
, когда поле this.lock
является final
?
Кроме того, он также использует локальную копию E[]
, прежде чем действовать на него:
private E extract() {
final E[] items = this.items;
E x = items[takeIndex];
items[takeIndex] = null;
takeIndex = inc(takeIndex);
--count;
notFull.signal();
return x;
}
Есть ли основания для копирования окончательного поля к локальной окончательной переменной?
Сильного акцент на «экстремальный»! Это не универсальная хорошая практика программирования, которую каждый должен подражать. –
Случайный FYI: в некоторых других случаях, когда вы видите это, это потому, что поле, о котором идет речь, является изменчивым, и метод должен убедиться, что он имеет одно постоянное значение или ссылку для него во всем. –
Я возьму эту «экстремальную» оптимизацию в таком базовом классе. –