kzen.dev
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
HUA Di
HUA Di
Вопрос

Почему исходный код JDK делает `финальную` копию `волевых` экземпляров

Я прочитал исходный код JDK'о ConcurrentHashMap.

Но следующий код сбил меня с толку:

public boolean isEmpty() {
    final Segment<K,V>[] segments = this.segments;
    ...
}

Мой вопрос в следующем:

"this.segments" объявлен:

final Segment<K,V>[] segments;

Итак, здесь, в начале метода, объявлена однотипная ссылка, указывающая на одну и ту же память.

Почему автор написал это именно так? Почему они не использовали this.segments напрямую? Есть ли какая-то причина?

74 2012-10-31T10:29:41+00:00 3
 OldCurmudgeon
OldCurmudgeon
Редактировал вопрос 8-го декабря 2015 в 11:00
Программирование
java
Решение / Ответ
Marko Topolnik
Marko Topolnik
31-го октября 2012 в 10:31
2012-10-31T10:31:57+00:00
Дополнительно
Источник
Редактировать
#17603198

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

Кроме того, даже если переменная-член не является переменной volatile, а является конечной, эта идиома связана с кэшем процессора, так как чтение из стека более удобно для кэша, чем чтение из случайного места кучи. Также существует большая вероятность того, что локальная переменная окажется привязанной к регистру процессора.

Для последнего случая есть некоторые разногласия, поскольку JIT-компилятор обычно заботится об этих проблемах, но Дуг Ли - один из тех, кто придерживается этого принципа.

Marko Topolnik
Marko Topolnik
Редактировал ответ 31-го октября 2012 в 10:46
94
0
 larry.li
larry.li
31-го октября 2012 в 10:52
2012-10-31T10:52:24+00:00
Дополнительно
Источник
Редактировать
#17603199

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

Вы можете обратиться к идиоме singleton из книги effective java by Joshua Bloch

Его синглтон находится здесь:

private volatile FieldType field;
FieldType getField() {
  FieldType result = field;
  if (result == null) { 
    synchronized(this) {
      result = field;
      if (result == null) 
        field = result = computeFieldValue();
    }
  }
  return result;
}

и он написал:

Этот код может показаться несколько запутанным. В частности, необходимость локальной переменной result может быть неясна. Эта переменная делает следующее. гарантировать, что поле будет прочитано только один раз в распространенном случае, когда оно > уже инициализировано. уже инициализировано. Хотя это не является строго необходимым, это может улучшить производительность и является более элегантным по стандартам, применяемым к низкоуровневому параллельного программирования. На моей машине приведенный выше метод работает примерно на 25 процентов быстрее, чем очевидная версия без локальной переменной.

 larry.li
larry.li
Редактировал ответ 31-го октября 2012 в 10:59
19
0
 irreputable
irreputable
31-го октября 2012 в 4:41
2012-10-31T16:41:55+00:00
Дополнительно
Источник
Редактировать
#17603200

Это может уменьшить размер байт-кода - обращение к локальной переменной в байт-коде короче, чем обращение к переменной экземпляра.

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

Но ни один из этих факторов не является существенным. Это больше относится к стилю кода. Если вы чувствуете себя комфортно с переменными экземпляра, конечно. Даг Ли, вероятно, чувствует себя более комфортно, имея дело с локальными переменными.

4
0
Похожие сообщества 11
pro.jvm
pro.jvm
5 814 пользователей
Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш канал: @proJVM Вакансии: @jvmjobs @jvmjobschat ⚠️ Оффтоп -> @flood ❌Переход на личности ❌Троллинг ❌Реклама ❌HH (вакансии) ❌Варез
Открыть telegram
learn.java
learn.java
5 375 пользователей
Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat
Открыть telegram
Java & Co
Java & Co
4 434 пользователей
Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/179171 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude
Открыть telegram
pro.JVM Jobs Chat
pro.JVM Jobs Chat
2 564 пользователей
Чат для обсуждения вакансий на JVM языках. Правила: - Никакого спама - Никакого троллинга и оскорблений участников - Размещение вакансий только через канал Канал для вакансий: @jvmjobs Основной чат: @jvmchat Наши друзья: @scala_jobs, @scala_jobs_feed
Открыть telegram
Java/Kotlin and more
Java/Kotlin and more
2 063 пользователей
чат о Java/Kotlin и связанных технологиях. We're discussing: job, tech questions etc. languages: russian, java, eng, kotlin Ссылка на чат: t.me/springframeworkio
Открыть telegram
Java Underground
Java Underground
1 751 пользователей
Библиотека по Java https://t.me/javalib Наше сообщество ВК: https://vk.com/javatutorial Вакансии и резюме свои строго в этот канал: https://t.me/job_java
Открыть telegram
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Ilya Smirnov
Зарегистрирован 6 дней назад
2
Денис Васьков
Зарегистрирован 1 неделю назад
3
Dima Patrushev
Зарегистрирован 1 неделю назад
4
sirojidddin otaboyev
Зарегистрирован 2 недели назад
5
Елена Гайдамамакинат
Зарегистрирован 2 недели назад
ID
KO
RU
© kzen.dev 2023
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией