Race Condition

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:

  1. operation1() -> operation2() -> operation3()
  2. operation1() -> operation3() -> operation2()
  3. operation2() -> operation1() -> operation3()
  4. operation2() -> operation3() -> operation1()
  5. oepration3() -> operation1() -> operation2()
  6. operation3() -> operation2() -> operation1()

Dają one odpowiednio różne wyniki:

  1. 0+3=3 -> 3-2=1 -> 1*2=2
  2. 0+3=3 -> 3*2=6 -> 6-2=4
  3. 0-2=-2 -> -2+3=1 -> 1*2=2
  4. 0-2=-2 -> -2*2=-4 -> -4+3=-1
  5. 0*2=0 -> 0+3=3 -> 3-2=1
  6. 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.