В ArrayBlockingQueue, почему поле участника финала копии в локальную последнюю переменную?

В ArrayBlockingQueue, все методы, которые требуют блокировки, копируют ее в локальное final переменная перед вызовом 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();
    }
}

Есть ли любая причина скопировать 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;
}

Есть ли какая-либо причина копирования заключительного поля к локальной последней переменной?

78
задан assylias 14 March 2013 в 11:14
поделиться

1 ответ

Это крайняя оптимизация, которую любит использовать Doug Lea, автор класса. Вот сообщение в недавней теме в списке рассылки core-libs-dev именно на эту тему, которое довольно хорошо отвечает на ваш вопрос.

из сообщения:

...копирование в локали производит наименьший байткод, а для низкоуровневого кода приятно писать код. который немного ближе к машине

64
ответ дан 24 November 2019 в 10:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: