:: Enseignements :: Master :: M1 :: 2015-2016 :: Java Avancé ::
[LOGO]

Rendez-vous et synchronization


Exercice 1 - Rendez vous (vous êtes cernés)

On souhaite écrire un petit programme qui permet de simuler le passage de paramètre entre une thread qui fait un calcul et la thread main (celle qui exécute le main).

  1. Que se passe-t-il lorsqu'on exécute ce code ?
  2. Commenter l'instruction Thread.sleep(1) dans la méthode get puis ré-exécuter le code.
    Que se passe-t-il ?
    Expliquer où est le bug ?
  3. Ecrire une classe RendezVous qui fonctionne comme la classe StupidRendezVous mais fonctionne correctement lorsque l'on commente l'instruction Thread.sleep(1).
  4. Rappeler ce qu'est une attente active, et expliquer pourquoi la classe RendezVous en est victime. Regarder l'utilisation du CPU par votre programme avec la commande top.
  5. Corriger le code de la classe RendezVous en utilisant les méthodes wait et notify pour éviter l'attente active. Regardez à nouveau l'utilisation du CPU par votre programme avec la commande top.
  6. Vérifiez que vous gérez les spurious wakeup correctement.

Exercice 2 - Exchanger

On souhaite implanter un Exchanger qui permet d'échanger deux valeurs entre deux threads.
L'idée est qu'une première thread va envoyer une valeur à l'Exchanger en utilisant la méthode exchange, celui-ci va bloquer la thread qui a fait appel à la méthode exchange et attendre. Lorsque une seconde thread fait elle aussi un appel à la méthode exchange avec une seconde valeur, l'appel retourne la première valeur envoyée et la première thread est dé-bloquée et son appel à exchange en retournant la seconde valeur.
En fait, la classe Exchanger existe déjà en Java (dans le package java.util.concurrent), et voici un code d'exemple

On se propose donc de ré-implanter cette classe.

  1. Comment faire pour distinguer le premier et le second appel à la méthode exchange ?
  2. Ecrire le code de la classe Exchanger.
  3. Modifier le code pour utiliser les locks du package java.util.concurrent.locks.
    Il faut utiliser la classe Condition et bien garder en tête qu'il faut utiliser les méthodes Condition.await et Condition.signal.
  4. Comment faire pour que l'Exchanger soit utilisable plus d'une fois ?
    On veut pouvoir exécuter un code comme celui-ci:
    et obtenir un affichage du type:
    thread 2 received from thread 0
    thread 0 received from thread 2
    thread 3 received from thread 8
    thread 8 received from thread 3
    thread 5 received from thread 9
    thread 9 received from thread 5
    thread 1 received from thread 7
    thread 7 received from thread 1
    thread 4 received from thread 6
    thread 6 received from thread 4