Adloun

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

Exercice suivant et tuteur

Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.

Le cours du chapitre · Tous les exercices du chapitre

Exercice suivant et tuteur →