В чём разница между volatile и synchronized?

Ключевое слово volatile в Java гарантирует, что чтение и запись переменной будут происходить напрямую из основной памяти, а не из кэша потока, обеспечивая видимость изменений между потоками.

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

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

Ключевое слово volatile в Java гарантирует, что чтение и запись переменной будут происходить напрямую из основной памяти, а не из кэша потока, обеспечивая видимость изменений между потоками.

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

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

Ключевое слово volatile в Java гарантирует, что чтение и запись переменной будут происходить напрямую из основной памяти, а не из кэша потока, обеспечивая видимость изменений между потоками.

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

Комбинация volatile и synchronized применяется, когда нужно обеспечить и видимость изменений переменной между потоками, и атомарность операций с ней. Например, если переменная читается часто без блокировок, но иногда обновляется в синхронизированном блоке, volatile гарантирует, что потоки увидят актуальное значение, а synchronized — что обновление будет атомарным.

Пример:

private volatile int counter;

public void increment() {
    synchronized(this) {
        counter++;
    }
}

public int getCounter() {
    return counter; // видит актуальное значение благодаря volatile
}

Таким образом, volatile обеспечивает видимость, а synchronized — атомарность и взаимное исключение.

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

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

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

Подробнее