J'ai quelques questions sur l'assigment de Java.Problèmes d'attribution Java - Est-ce atomique?
- Cordes
J'ai une classe:
public class Test {
private String s;
public synchronized void setS(String str){
s = s + " - " + str;
}
public String getS(){
return s;
}
}
J'utilise "synchronisé" dans mon setter, et en évitant dans mon getter, parce que dans mon application, il y a des tonnes de données, et très peu de paramètres. Les paramètres doivent être synchronisés pour éviter les incohérences. Ma question est: est d'obtenir et de définir une variable atomique? Je veux dire, dans un environnement multithread, Thread1 est sur le point de définir des variables, tandis que Thread2 est sur le point d'obtenir "s". Est-il possible que la méthode getter puisse avoir quelque chose de différent de l'ancienne valeur de s ou de la nouvelle valeur de s (supposons que nous ayons seulement deux threads)? Dans mon application, il n'est pas un problème pour obtenir la nouvelle valeur, et ce n'est pas un problème pour obtenir l'ancien. Mais pourrais-je avoir autre chose?
- Et qu'en est-il de HashMap?
considérant ceci:
public class Test {
private Map<Integer, String> map = Collections.synchronizedMap(new HashMap<Integer, String>());
public synchronized void setMapElement(Integer key, String value){
map.put(key, value);
}
public String getValue(Integer key){
return map.get(key);
}
}
met et obtenir atomique? Comment HashMap gère-t-il l'insertion d'un élément? Est-ce qu'il supprime d'abord l'ancienne valeur et met le maintenant? Pourrais-je avoir autre chose que l'ancienne valeur ou la nouvelle valeur?
Merci d'avance!
+1 pour spécifier que les lecteurs n'ont pas besoin de voir la dernière valeur absolue. Bien sûr, cela devrait certainement être documenté dans le code de production. –