programmation Java (école d'ingénieur) · Chapitre 15 · Application directe du cours
Questions de cours
Threads · niveau 1 (application)
Énoncé
Répondre en une ou deux phrases.
- Un élève « corrige » la condition de course du compteur partagé en ajoutant dans la boucle l'instruction
Thread.sleep(1). Le résultat semble juste. Est-ce une correction ? - Pourquoi déclarer
volatilele compteur ne suffit-il pas ? - Une méthode
synchronizedd'un objetc1empêche-t-elle un autre fil d'exécuter la même méthode sur un autre objetc2? - Que se passe-t-il si l'on appelle deux fois
start()sur le même thread ?
Corrigé
- Non. Le
sleepchange la fréquence des entrelacements dangereux sans les supprimer : l'erreur devient rare, donc plus difficile à trouver. Seuls un verrou ou une opération atomique corrigent le programme. volatilegarantit que chaque fil voit la dernière valeur écrite, maiscompteur++reste trois opérations (lire, ajouter, écrire) : deux fils peuvent toujours lire la même valeur. Il faut l'atomicité, pas seulement la visibilité.- Non : chaque objet a son propre verrou. Deux fils peuvent exécuter simultanément
c1.retireretc2.retirer. Ils ne s'excluent que sur le même objet. - Le second appel lève une
IllegalThreadStateException: un thread ne se démarre qu'une fois. Pour refaire la tâche, on crée un nouveau thread (ou l'on utilise un pool).
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.