programmation Java (école d'ingénieur) · Chapitre 15 · Exercice de TD
Un journal partagé
Threads · niveau 2
Énoncé
Plusieurs fils ajoutent des messages dans une ArrayList<String> partagée. Expliquer ce qui peut mal se passer (deux problèmes au moins), puis proposer deux corrections : l'une avec synchronized, l'autre avec une classe de la bibliothèque.
Corrigé
ArrayList n'est pas prévue pour être modifiée par plusieurs fils. Deux add simultanés peuvent écrire dans la même case (un message est perdu, comme pour le compteur), ou survenir pendant que la liste agrandit son tableau interne (exception ArrayIndexOutOfBoundsException, ou case laissée à null). Un fil qui parcourt la liste pendant qu'un autre la modifie peut aussi recevoir une ConcurrentModificationException. Corrections :
- entourer chaque accès d'un
synchronized (journal) { ... }, y compris les lectures et les parcours ; - ou utiliser une collection prévue pour cela : une liste synchronisée,
List<String> journal = Collections.synchronizedList(new ArrayList<>());
une CopyOnWriteArrayList (adaptée à beaucoup de lectures et peu d'écritures), ou une ConcurrentLinkedQueue.
100 % gratuit
La suite du chapitre est sur Adloun
- 9 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.