Gegeven is het volgende programmafragment in Java:
private int x = 0;
public void verhoogX() {
for (int i = 0; i < 10000000; i++) {
x = x + 1;
}
}
Leg uit waarom in het geval van parallel programmeren er sprake kan zijn
van een race condition bij de uitvoering van de gegeven code.
Aanwijzing: Schets voor de uitleg een scenario met daarin twee threads.
Verander de Java-code zo dat de race condition opgeheven is.


  • In de for-lus gebeurt het ophogen van de waarde van x in drie stappen: eerst wordt
    de waarde van x uit het geheugen gelezen, dan wordt de waarde verhoogd en
    tenslotte wordt de verhoogde waarde teruggeplaatst in het geheugen.
    Stel, twee threads voeren de for-lus tegelijk uit. Het volgende scenario is mogelijk:
    Thread 1: leest x, waarde x in het geheugen is 7
    Thread 1: verhoogd x, waarde is nu 8
    Thread 2: leest x, waarde x in het geheugen is 7
    Thread 1: schrijft de waarde van x, waarde x in het geheugen is nu 8
    Thread 2: verhoogd x, waarde is nu 8
    Thread 2: schrijft de waarde van x, waarde x in het geheugen is nu 8.
    Voeren de twee threads de for-lus achter elkaar uit, dan is de waarde van x na
    afloop 9. Er is dus een verschil in uitkomst.
     Voor de methode verhoogX kunnen we een synchronized-clausule gebruiken:
    private int x = 0;
    public synchronized void verhoogX() {
    for (int i = 0; i < 10000000; i++) {
    x = x + 1;
    }
    }
    NB Het is niet mogelijk om een synchronized-opdracht (blok-opdracht) te
    gebruiken waarbij we op attribuut x synchroniseren. Het attribuut x is namelijk
    geen object maar een primitief type.

    Rapporteer Plaats commentaar