Les conditions de concurrence se produisent lorsque le résultat d'un calcul dépend de l'ordre dans lequel les expressions et les instructions sont évaluées.
Le résultat peut différer si l'évaluation des expressions et des instructions modifie l'état, produisant des effets secondaires.
Si tout dans votre code est immuable, il n'y a pas d'altération de l'état, pas d'effets secondaires lors de l'évaluation des expressions et des déclarations. Par conséquent, l'ordre d'évaluation n'affecte pas le résultat final.
Consultez le code suivant:
Map<String, Integer> map = Collections.singletonMap("key", 0);
public void increment() {
int val = map.get("key);
map.put("key", val + 1);
}
Si deux threads exécutent chaque instruction de la méthode increment()
en même temps, à la fois lire la même valeur 0
et les deux mis la même valeur 1
incrémentée dans le map
. D'où le résultat serait 1
.
Si les deux fils (par hasard) exécuteraient toutes les déclarations consécutivement un thread lirait la valeur 0
et mettre la valeur 1
tandis que l'autre thread lirait la valeur 1
et mettre la valeur 2
.
Maintenant, si la carte serait immuable et les deux fils exécuterait la méthode suivante:
public void logMap() {
System.out.println("Key has value " + map.get("key"));
}
le résultat serait toujours le même, parce qu'il n'y a pas d'effets secondaires (en plus des modifications apportées par System.out.println) qui effectue le calcul.
Si un objet est immuable, peu importe le nombre de threads qui y accèdent. –
Vous ne pouvez pas avoir de modification simultanée si vous ne pouvez pas modifier les choses. – user2357112