Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Java: concurrency, atomic, synchronization, counter

Как реализовать безопасный инкремент счетчика в многопоточной среде?

Проверяет знание thread-safe подходов для атомарных операций.

Короткий ответ

Используйте AtomicLong для CAS-операций, synchronized для блокировок или LongAdder при высокой конкуренции. В распределенных системах — Redis INCR или SQL UPDATE table SET counter = counter + 1.

Длинный ответ

Варианты реализации:

  1. AtomicLong (неблокирующий):

    private AtomicLong viewCount = new AtomicLong(0);
    
    void increment() {
        	viewCount.incrementAndGet(); // Атомарный CAS
    }
  2. LongAdder (высокая конкуренция):

    private LongAdder adder = new LongAdder();
    
    void increment() {
        	adder.increment(); // Распределяет нагрузку между ячейками
    }
  3. База данных (распределенные системы):

    UPDATE page_views SET count = count + 1 WHERE page_id = 'home';

Почему не volatile?

private volatile long counter; // Недостаточно!
counter++; // Не атомарная операция (читает + инкремент + пишет)

Вывод: Для локальных счетчиков используйте LongAdder, для распределенных — БД/Redis.

Уровень

  • Рейтинг:

    2

  • Сложность:

    6

Навыки

  • Java

    Java

Ключевые слова

#concurrency

#atomic

#synchronization

#counter

Подпишись на Java Developer в телеграм