W programie ArrayBlockingQueue
wszystkie metody, które wymagają blokady, kopiują ją do final
zmiennej lokalnej przed wywołaniem lock()
.
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();
}
}
Czy jest jakiś powód, aby skopiować this.lock
do zmiennej lokalnej, lock
gdy pole this.lock
jest final
?
Dodatkowo używa również lokalnej kopii E[]
przed podjęciem działań na niej:
private E extract() {
final E[] items = this.items;
E x = items[takeIndex];
items[takeIndex] = null;
takeIndex = inc(takeIndex);
--count;
notFull.signal();
return x;
}
Czy jest jakiś powód do kopiowania końcowego pola do lokalnej zmiennej końcowej?
Ten wątek zawiera kilka odpowiedzi. W istocie:
źródło
final
zmienna musiała być ponownie ładowana przez JVM. Jeśli zmodyfikujeszfinal
zmienną przez odbicie, stracisz gwarancję, że Twój program będzie działał poprawnie (co oznacza, że nowa wartość może nie zostać uwzględniona we wszystkich przypadkach).