Je sais que c'est clairement une condition de concurrence. Mais quelles sont les choses possibles qui peuvent arriver?Quel est le pire qui puisse arriver en état de course java?
class Blah {
List<String> stuff;
public List<String> getStuff() {
return stuff
}
public void setStuff(List<String> newValue) {
this.stuff = newValue
}
}
b = new Blah();
// Thread one
b.setStuff(getListFromSomeNetworkResource());
for (String c : b.getStuff()) {
// Work with c
}
// Thread two
b.setStuff(getListFromSomeNetworkResource());
for (String c : b.getStuff()) {
// Work with c
}
- Cela peut-il RuntimeException jeter?
- Est-ce que ce segfault se sépare de jvm?
- Est-ce que cela peut provoquer une erreur de segmentation?
- Cela dépend du processeur. Et si c'est un processeur Intel Xeon?
- Est-ce que cela peut lancer une exception NullPointer?
- Discussion 2 peut lire le contenu défini par fil 1 et vice versa si la fonction retourne réellement différentes valeurs
Je comprends que c'est une condition de course et n'écrire un tel code. Mais comment convaincre les autres de ne pas le faire?
Mise à jour:
Hypothèses:
getListFromSomeNetworkResource()
retourne toujours une nouvelleArrayList
. La taille peut être 0 ou plus.getListFromSomeNetworkResource()
est thread-safe.
Downvoters, s'il vous plaît laisser un commentaire – balki