Warunek wyścigu (ang. race condition) – jest to sytuacja, w której działanie systemu zależy od kolejności, w jakiej wykonają się dwie lub więcej operacji.
Przykład
Załóżmy, że mamy trzy operacje (metody operation1, operation2, operation3), operujące na jednej zmiennej:
class Main{
static int variable = 0;
static void operation1(){
variable+=3;
}
static void operation2(){
variable-=2;
}
static void operation3(){
variable*=2;
}
} I teraz jeśli każda z tych operacji byłaby wykonywana równolegle, to mamy sześć możliwych kolejności wykonania:
- operation1() -> operation2() -> operation3()
- operation1() -> operation3() -> operation2()
- operation2() -> operation1() -> operation3()
- operation2() -> operation3() -> operation1()
- oepration3() -> operation1() -> operation2()
- operation3() -> operation2() -> operation1()
Dają one odpowiednio różne wyniki:
- 0+3=3 -> 3-2=1 -> 1*2=2
- 0+3=3 -> 3*2=6 -> 6-2=4
- 0-2=-2 -> -2+3=1 -> 1*2=2
- 0-2=-2 -> -2*2=-4 -> -4+3=-1
- 0*2=0 -> 0+3=3 -> 3-2=1
- 0*2=0 -> 0-2=-2 -> -2+3=1
Jak widać, w zależności od kolejności wykonania możemy otrzymać wyniki: -1,1,2 lub 4.
