Чем LongAdder выигрывает у AtomicLong при высокой конкуренции и в чём его ограничение?
LongAdder разносит счёт по нескольким ячейкам: потоки не бьются за одну переменную, CAS не промахивается, кэш-линия не скачет между ядрами. Итог — сумма ячеек, а не мгновенно согласованное значение.
- Идеален для метрик и статистики: много записей, редкие чтения
- Нет compareAndSet и incrementAndGet с возвратом
- Больше памяти
А ещё AtomicLong — когда нужно точное значение после каждой операции
Подробно
У AtomicLong под нагрузкой все потоки бьются за одну переменную: цикл CAS постоянно промахивается, а кэш-линия непрерывно инвалидируется между ядрами — это ещё называют ложным разделением. LongAdder заводит массив ячеек и распределяет потоки между ними, поэтому при росте числа потоков масштабируется заметно лучше. Плата — метод sum() складывает ячейки без глобальной блокировки, поэтому при параллельных обновлениях он возвращает не мгновенный согласованный снимок, а приблизительное значение. Отсюда правило выбора: LongAdder хорош для метрик и счётчиков, где важна пропускная способность записи, а точное значение нужно изредка; AtomicLong — когда требуется точное текущее значение или операции вроде compareAndSet.
Что хотят услышать
- Механизм распределения и почему быстрее.
- Ограничение: сумма не атомарный снимок.
Частые ошибки
- Использовать LongAdder там, где нужно точное значение в каждый момент.
- Считать AtomicLong устаревшим.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓Счёт разнесён по ячейкам, и конкуренция ниже, но sum() — не атомарный снимок
- ✗LongAdder точнее считает под нагрузкой, а AtomicLong может терять обновления
- ✗LongAdder использует блокировки вместо CAS и потому надёжнее
- ✗Ограничений нет: LongAdder всегда предпочтительнее
Что спросят дальше
- Что такое ложное разделение кэш-линий?
- Когда AtomicLong остаётся правильным выбором?
Разбор темы
- volatile, атомарность и CAS
Разница видимости и атомарности, atomic-классы, compare-and-swap и ABA, контеншн и LongAdder.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.