Junior — Middle
86
Jaka jest różnica między używaniem słowa kluczowego 'volatile' dla operacji atomowych a zsynchronizowanymi blokami w Java?
Firmy, w których zadano pytania
Передовые Платежные Решения
Odpowiedź od AI
sobes.tech AI
Ключевое слово volatile в Java гарантирует видимость изменений переменной между потоками, то есть когда один поток изменяет значение volatile-переменной, другие потоки сразу увидят это изменение. Однако volatile не обеспечивает атомарность сложных операций (например, инкремента), только чтение и запись примитивных типов.
Синхронизированные блоки (synchronized) обеспечивают как видимость, так и атомарность: они блокируют доступ к коду или данным, позволяя только одному потоку выполнять критическую секцию одновременно. Это предотвращает состояния гонки при изменении общих данных.
Пример:
volatile int counter = 0;
// Инкремент не атомарен, даже с volatile
counter++;
// Синхронизация для атомарного инкремента
synchronized(this) {
counter++;
}
Итого:
volatile— гарантирует свежесть значения, но не атомарность операций.synchronized— гарантирует и атомарность, и видимость, но с накладными расходами на блокировку.