Безопасно ли инкрементировать volatile переменную (counter++)?

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

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

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

При параллельном увеличении значения целочисленной переменной несколькими потоками без синхронизации возможны гонки данных. Это значит, что итоговое значение может быть меньше ожидаемого, так как операции чтения, увеличения и записи не атомарны.

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

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

При параллельном увеличении значения целочисленной переменной несколькими потоками без синхронизации возможны гонки данных. Это значит, что итоговое значение может быть меньше ожидаемого, так как операции чтения, увеличения и записи не атомарны.

Например, если два потока одновременно читают значение 5, оба увеличивают до 6 и записывают, итог будет 6 вместо 7.

Чтобы избежать этого, нужно использовать механизмы синхронизации, например, ключевое слово synchronized или атомарные классы из java.util.concurrent.atomic:

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 и не попадает в захват экрана.

Подробнее