2017-09-13 4 views
3

J'ai la classe suivanteEst-ce que la modification d'un champ volatile met à jour l'objet?

public class Guardian { 
    volatile String response; 
    private Future future; 
    private Long time; 
} 

Si la réponse devait être modifiée par le thread A, serait alors le thread B voir la nouvelle valeur de réponse via:

Guardian guardian = requestManager.getGuardian(); 
String response = guardian.getResponse(); 
+3

* "Ne changeant un champ volatile mettre à jour l'objet? "* Pourquoi pas? Changer un champ non-volatile le fait. –

Répondre

3

En supposant que vous savez que la chaîne est immuable alors oui, le mot-clé volatile vous donne la garantie que le thread B aura la dernière valeur de réponse peu importe le thread qui s'est passé.

1

Est-ce que guardian.getResponse() répond simplement? Si c'est le cas, alors oui - si le thread A modifie guardian.response et que le thread B appelle getResponse() par la suite, le thread B verra la nouvelle valeur.

1

Oui. C'est précisément la garantie que vous obtenez du mot clé volatile.

3

Le mot clé volatile empêche la mise en cache d'une variable dans la mémoire locale du thread. Ce qu'il empêche est false positives car votre variable a été modifiée dans la mémoire principale, mais cette modification n'a pas été reflétée dans la mémoire cache locale.

Votre exemple serait l'objet d'un Race condition parce que cela dépendra du temps nécessaire pour chacun des fils pour exécuter leurs opérations pertinentes, mais en supposant que n'est pas un problème, alors oui, vous obtiendrez le dernière version de cette variable dans la JVM car elle n'était pas mise en cache dans la mémoire locale du thread.

1

OUI

Le volatile fait les fils de lire la valeur réelle à chaque fois, alors que dans les cas réguliers threads peuvent mettre en cache la valeur et ne pas être au courant de son changement