Data race или состояние гонки — это ошибка проектирования многопоточной системы, при которой работа программы зависит от порядка выполнения частей кода, которые не синхронизированы должным образом.
Обновление от 12.07.2021: Судя по всему, в статье произошла путаница терминов. Data Race — это не состояние гонки. Скорее race condition нужно переводить как состояние гонки, а data race — это немного другое. Статью, похоже, нужно переписать или поправить.
Состояние гонки зачастую сложно исправить, так как оно проявляется в случайные моменты времени и пропадает при попытке её локализовать. Data race возникает при условии:
- два или более потока обращаются к одной и той же общей переменной;
- как минимум один из потоков пытается менять значение этой переменной;
- потоки не используют блокировки для обращения к этой переменной.
При выполнении этих трёх условий порядок обращения к переменной становится неопределённым, что приводит к различным и непредвиденным результатам выполнения программы при каждом запуске.
Пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
public class Main { static volatile int sharedValue; public static void main(String[] args) throws InterruptedException { Thread thread1 = new Thread(new Runnable() { @Override public void run() { while (true) { if (sharedValue % 2 == 0) { System.out.println("sharedValue = " + sharedValue); } } } }); Thread thread2 = new Thread(new Runnable() { @Override public void run() { while (true) sharedValue++; } }); thread1.start(); thread2.start(); thread1.join(); thread2.join(); } } |
Если вы запустите этот код, то в некоторых случаях он будет выводить и нечётные переменные, хотя перед выводом в консоль стоит проверка на чётность. Это происходит из-за несинхронизированного обращения к общей переменной.
Например:
- Оператор if проверяет x на чётность.
- Второй поток увеличивает значение переменной x в x++.
- Оператор вывода в первом потоке выводит увеличенное значение переменной.
Для решения проблемы состояния гонки нужно использовать методы синхронизации, которые я описывал в статье про многопоточность в Java.
Рекомендую также не забывать удалять пароли из памяти после использования.
Всегда будьте в курсе новых фич в Java, так как это поможет вам использовать этот язык на современном уровне.
Ещё Стив Мобс говорил, что многопоточность это не труЪ
>Ещё Стив Мобс говорил, что многопоточность это не труЪ
Переходи на одноядерные процессоры тогда.