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

Если выполнить операцию инкремента (например, counter++ или counter += 1) над переменной в многопоточной среде без синхронизации, возможна гонка данных (race condition).

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

Что ответить на собеседовании

Если выполнить операцию инкремента (например, counter++ или counter += 1) над переменной в многопоточной среде без синхронизации, возможна гонка данных (race condition). Это происходит потому, что операция инкремента не является атомарной — она состоит из нескольких шагов (чтение значения, увеличение, запись обратно).

Подробный разбор

Ответ с пояснениями

Если выполнить операцию инкремента (например, counter++ или counter += 1) над переменной в многопоточной среде без синхронизации, возможна гонка данных (race condition). Это происходит потому, что операция инкремента не является атомарной — она состоит из нескольких шагов (чтение значения, увеличение, запись обратно).

В результате:

  • Несколько потоков могут одновременно прочитать одно и то же значение,
  • Каждый увеличит его локально,
  • Запишут обратно, перезаписывая изменения друг друга.

Это приведёт к тому, что итоговое значение переменной будет меньше ожидаемого, так как некоторые инкременты «потеряются».

Для предотвращения таких ошибок в Java используют механизмы синхронизации, например:

  • synchronized блоки или методы,
  • классы из java.util.concurrent.atomic (например, AtomicInteger),
  • другие примитивы блокировки (Lock).

Пример с AtomicInteger:

import java.util.concurrent.atomic.AtomicInteger;

public class Counter {
    private AtomicInteger count = new AtomicInteger(0);

    public void increment() {
        count.incrementAndGet();
    }

    public int getCount() {
        return count.get();
    }
}

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее