Data Race / Состояние гонки

Data race или состояние гонки — это ошибка проектирования многопоточной системы, при которой работа программы зависит от порядка выполнения частей кода, которые не синхронизированы должным образом.

Состояние гонки зачастую сложно исправить, так как оно проявляется в случайные моменты времени и пропадает при попытке её локализовать. Data race возникает при условии:

  • два или более потока обращаются к одной и той же общей переменной;
  • как минимум один из потоков пытается менять значение этой переменной;
  • потоки не используют блокировки для обращения к этой переменной.

При выполнении этих трёх условий порядок обращения к переменной становится неопределённым, что приводит к различным и непредвиденным результатам выполнения программы при каждом запуске.

Пример:

Если вы запустите этот код, то в некоторых случаях он будет выводить и нечётные переменные, хотя перед выводом в консоль стоит проверка на чётность. Это происходит из-за несинхронизированного обращения к общей переменной.

Например:

  1. Оператор if проверяет x на чётность.
  2. Второй поток увеличивает значение переменной x в x++.
  3. Оператор вывода в первом потоке выводит увеличенное значение переменной.

Для решения проблемы состояния гонки нужно использовать методы синхронизации, которые я описывал в статье про многопоточность в Java.

Рекомендую также не забывать удалять пароли из памяти после использования.

Всегда будьте в курсе новых фич в Java, так как это поможет вам использовать этот язык на современном уровне.


Поделиться:

Один комментарий к “Data Race / Состояние гонки”

Добавить комментарий

Ваш e-mail не будет опубликован.