Junior — Middle
Czy użycie volatile dla zmiennej typu long zapewnia bezpieczne wykonywanie równoległego zwiększania licznika z wielu wątków?
sobes.tech AI
Odpowiedź od AI
Использование volatile для переменной типа long гарантирует видимость изменений между потоками, но не обеспечивает атомарность операций, таких как увеличение счетчика.
Например, операция counter++ состоит из трёх шагов: чтение, увеличение, запись. Даже если переменная volatile, два потока могут одновременно прочитать одно и то же значение, увеличить и записать, что приведёт к потере обновления.
Для безопасного параллельного увеличения счетчика лучше использовать:
- Класс AtomicLong из java.util.concurrent.atomic, который обеспечивает атомарные операции.
- Синхронизацию (synchronized) вокруг операции увеличения.
Пример с AtomicLong:
AtomicLong counter = new AtomicLong(0);
counter.incrementAndGet();
Таким образом, volatile не обеспечивает безопасное параллельное увеличение счетчика.