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

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

Обновление от 12.07.2021: Судя по всему, в статье произошла путаница терминов. Data Race — это не состояние гонки. Скорее race condition нужно переводить как состояние гонки, а data race — это немного другое. Статью, похоже, нужно переписать или поправить.

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

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

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

Пример:

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

Например:

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

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

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

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

Data Race / Состояние гонки: 2 комментария

  1. >Ещё Стив Мобс говорил, что многопоточность это не труЪ
    Переходи на одноядерные процессоры тогда.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *