Spring Boot : écrire le serveur (école d'ingénieur) · Chapitre 2 · Application directe du cours
Un compteur partagé
Injection de dépendances et configuration · niveau 2
Énoncé
Un composant CompteurVisites a une méthode incrementer() qui renvoie le nombre de visites. Deux contrôleurs différents le reçoivent et répondent, sur /ex7/a et /ex7/b, la valeur renvoyée par incrementer(). On appelle successivement /ex7/a, /ex7/b, /ex7/a. Prédire les trois réponses. Pourquoi faut-il un AtomicInteger plutôt qu'un simple int ?
Corrigé
Il n'y a qu'un CompteurVisites, partagé par les deux contrôleurs : les réponses sont 1, 2, 3.
$ curl localhost:8080/ex7/a
1
$ curl localhost:8080/ex7/b
2
$ curl localhost:8080/ex7/a
3
@Component
public class CompteurVisites {
// AtomicInteger : le bean unique est utilisé par plusieurs requêtes en même temps.
private final AtomicInteger visites = new AtomicInteger();
public int incrementer() {
return visites.incrementAndGet();
}
}
Deux requêtes simultanées s'exécutent sur deux fils. Avec un int, visites++ se décompose en lecture, addition, écriture : les deux fils peuvent lire la même valeur et écrire le même résultat, et une visite est perdue. incrementAndGet() fait les trois opérations de façon indivisible.
100 % gratuit
La suite du chapitre est sur Adloun
- 10 autres exercices corrigés dans ce chapitre
- Les 2 QCM du chapitre, le premier sans compte
- Le tuteur, qui guide pas à pas sans donner la réponse
Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.