Sobes.tech
Back to questions
Junior — Middle
63

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

Companies where asked
Передовые Платежные Решения

Answer from AI

sobes.tech AI

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

Синхронизированные блоки (synchronized) обеспечивают как видимость, так и атомарность: они блокируют доступ к коду или данным, позволяя только одному потоку выполнять критическую секцию одновременно. Это предотвращает состояния гонки при изменении общих данных.

Пример:

volatile int counter = 0;

// Инкремент не атомарен, даже с volatile
counter++;

// Синхронизация для атомарного инкремента
synchronized(this) {
    counter++;
}

Итого:

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