2017-05-19 3 views
-1

Vous trouverez ci-dessous une réponse sur la façon d'éviter les conditions de course. What is a race condition?Comment les objets immuables aident à prévenir les conditions de course

La meilleure chose serait de créer libres et apatrides effet secondaire fonctions, utilisation immutables autant que possible. Mais ce n'est pas toujours possible. Ainsi, en utilisant java.util.concurrent.atomic, les structures de données concurrentes , la synchronisation correcte et la concurrence basée sur l'acteur aideront .

Cette réponse dit utiliser immutables autant que possible. Je suis confus sur la façon dont les objets immuables empêchent les conditions de course.

+0

Si un objet est immuable, peu importe le nombre de threads qui y accèdent. –

+4

Vous ne pouvez pas avoir de modification simultanée si vous ne pouvez pas modifier les choses. – user2357112

Répondre

1

Les conditions de concurrence ne peuvent survenir que lorsqu'au moins un thread est autorisé à écrire/modifier l'état des instances. cas Immuable sont readonly, leur état ne peuvent pas être modifiés, par conséquent, toutes les discussions ne lisent l'état d'un objet et voir la même valeur (s)

0

Un data race se produit lorsque « deux ou plusieurs fils ... accéder au même emplacement mémoire simultanément, et au moins l'un des accès est pour l'écriture, et les threads n'utilisent pas de verrous exclusifs pour contrôler leurs accès à cette mémoire. "

Il ne peut y avoir aucune course de données si les données sont immuables, car il ne peut y avoir d'accès en écriture.

En outre, le Java Memory Model guarantees:

une fois qu'un objet est construit, les valeurs attribuées aux champs final dans le constructeur sera visible à tous les autres threads sans synchronisation.

0

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.