Когда и зачем следует применять комбинацию ключевых слов synchronized и volatile в Java для обеспечения потокобезопасности?
Answer from AI
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 — атомарность и взаимное исключение.