Получить доступ

Реализуй потокобезопасный счётчик Counter с методами increment() и get().

MiddleМногопоточность
Коротко

Проще всего — AtomicInteger: incrementAndGet() и get(), без блокировок. Альтернатива — synchronized на обоих методах (важно: и на чтении тоже, иначе нет видимости).

  • Ошибка — volatile int с count++: теряет обновления
  • Ошибка — synchronized только на increment: get может прочитать устаревшее значение
  • Под высокой конкуренцией — LongAdder

А ещё Расскажите про CAS, если попросят пояснить

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

private final AtomicInteger c = new AtomicInteger(); increment → c.incrementAndGet(); get → c.get(). Альтернатива — synchronized на обоих методах.

Пример

class Counter {
    private final AtomicInteger value = new AtomicInteger();
    public int increment() { return value.incrementAndGet(); }
    public int get() { return value.get(); }
}

Вариант с монитором:

class Counter {
    private int value;
    public synchronized int increment() { return ++value; }
    public synchronized int get() { return value; }
}

Что хотят услышать

  • Рабочая реализация.
  • Почему volatile++ не подходит.
  • Синхронизация чтения.
  • LongAdder при высокой конкуренции.

Частые ошибки

  • volatile-счётчик с ++ (гонка).
  • synchronized только на increment, но не на get (теряется видимость).

Что спросят дальше

  • Чем LongAdder лучше AtomicLong?
  • Что гарантирует happens-before здесь?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем