Adloun

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

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 →