Sobes.tech
Назад к вопросам
Junior — Middle
60

Когда и зачем следует применять комбинацию ключевых слов synchronized и volatile в Java для обеспечения потокобезопасности?

Компании, где спрашивали
Stroki

Ответ от нейросети

sobes.tech AI

Ключевое слово 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 — атомарность и взаимное исключение.