Adloun

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 volatile le compteur ne suffit-il pas ?
  • Une méthode synchronized d'un objet c1 empêche-t-elle un autre fil d'exécuter la même méthode sur un autre objet c2 ?
  • Que se passe-t-il si l'on appelle deux fois start() sur le même thread ?

Corrigé

  • Non. Le sleep change 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.
  • volatile garantit que chaque fil voit la dernière valeur écrite, mais compteur++ 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.retirer et c2.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

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 →