Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Зачем локальная переменная(исходники java.util.concurrent.LinkedBlockingQueue) / 4 сообщений из 4, страница 1 из 1
24.12.2014, 15:58
    #38841849
Antipich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зачем локальная переменная(исходники java.util.concurrent.LinkedBlockingQueue)
Изучал тут на досуге исходники java.util.concurrent.LinkedBlockingQueue
И заметил там такую штуку:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
 public boolean More ...offer(E e) {
354        if (e == null) throw new NullPointerException();
355        final AtomicInteger count = this.count;
356        if (count.get() == capacity)
357            return false;
358        int c = -1;
359        final ReentrantLock putLock = this.putLock;
360        putLock.lock();
361        try {
362            if (count.get() < capacity) {
363                insert(e);
364                c = count.getAndIncrement();
365                if (c + 1 < capacity)
366                    notFull.signal();
367            }
368        } finally {
369            putLock.unlock();
370        }
371        if (c == 0)
372            signalNotEmpty();
373        return c >= 0;
374    }


При этом переменная this.putLock, которая используется в 359 строке объявлена так в этом классе:
Код: java
1.
105    private final AtomicInteger count = new AtomicInteger(0);


Вопрос, зачем они создают эту локальную переменную в 359 строке, почему просто далее в методе вместо локальной переменной count не использовать this.count? Чтобы именно как final внутри метода объявить, чтобы не изменить ее случаем внутри? Вроде по части разруливания ее между потоками тут какого-то подсмысла нет, или я не прав?
...
Рейтинг: 0 / 0
24.12.2014, 15:59
    #38841854
Antipich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зачем локальная переменная(исходники java.util.concurrent.LinkedBlockingQueue)
Прошу прощения, всегда имел ввиду объявление локальной переменной count в 355 строке, а не putLock :) Просто ситуация там по ним одинаковая и я опечатался.
...
Рейтинг: 0 / 0
24.12.2014, 16:15
    #38841883
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зачем локальная переменная(исходники java.util.concurrent.LinkedBlockingQueue)
Antipich,

Не стоит изучать исходники java.* как пример для использования. Особенно в concurrent присутствует масса тонких оптимизаций которые существуют только потому что внутри самой JVM что-то так работает. Ответ на многие вопросы к такому коду - "а Goetz его знает".
...
Рейтинг: 0 / 0
24.12.2014, 16:20
    #38841895
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зачем локальная переменная(исходники java.util.concurrent.LinkedBlockingQueue)
AntipichВопрос, зачем они создают эту локальную переменную в 359 строке, почему просто далее в методе вместо локальной переменной count не использовать this.count? Чтобы именно как final внутри метода объявить, чтобы не изменить ее случаем внутри? Вроде по части разруливания ее между потоками тут какого-то подсмысла нет, или я не прав?
Обращение к локальной переменной быстрее чем к полю. Классы java.util.concurrent разрабатываются с целью использования в высоконагруженых участках кода. Так как при низкой конкурентности особой нужды в них может и не быть.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Зачем локальная переменная(исходники java.util.concurrent.LinkedBlockingQueue) / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]