Sobes.tech
Назад к вопросам
Senior
5

Что такое happens-before? Почему i++ без синхронизации небезопасен?

Компании, где спрашивали
СБЕРСБЕР

Ответ от нейросети

sobes.tech AI

Happens-before — это отношение между операциями в многопоточном программировании, которое гарантирует, что одна операция видима и происходит до другой. В Java это ключевая концепция для обеспечения корректной синхронизации и видимости изменений между потоками.

Операция i++ не является атомарной: она состоит из трёх шагов — чтение значения i, увеличение на 1, запись обратно. Без синхронизации два потока могут одновременно прочитать одно и то же значение i, увеличить и записать, что приведёт к потере обновления.

Без happens-before гарантии изменения, сделанные одним потоком, могут быть не видны другому, а операции могут выполняться в произвольном порядке из-за оптимизаций компилятора и процессора.

Пример проблемы:

class Counter {
  int i = 0;

  void increment() {
    i++; // неатомарно
  }
}

Если несколько потоков вызывают increment() без синхронизации, итоговое значение i может быть меньше ожидаемого.

Для корректности нужно использовать synchronized, volatile, AtomicInteger или другие механизмы, обеспечивающие happens-before и атомарность.