Sobes.tech
Junior — Middle

Biztosítja a volatile használata hossz típusú változóra a párhuzamos számláló növelésének biztonságos végrehajtását több szálból?

sobes.tech MI

Válasz az MI-től

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

Например, операция counter++ состоит из трёх шагов: чтение, увеличение, запись. Даже если переменная volatile, два потока могут одновременно прочитать одно и то же значение, увеличить и записать, что приведёт к потере обновления.

Для безопасного параллельного увеличения счетчика лучше использовать:

  • Класс AtomicLong из java.util.concurrent.atomic, который обеспечивает атомарные операции.
  • Синхронизацию (synchronized) вокруг операции увеличения.

Пример с AtomicLong:

AtomicLong counter = new AtomicLong(0);
counter.incrementAndGet();

Таким образом, volatile не обеспечивает безопасное параллельное увеличение счетчика.