:: Enseignements :: Master :: M1 :: 2015-2016 :: Java Avancé ::
![[LOGO]](http://igm.univ-mlv.fr/ens/resources/mlv.png) | Synchronized, lock, trylock |
Exercice 1 - Tableau d'honneur
Une école possède un tableau d'honneur (où l'on met le nom de l'élève le plus méritant) qui
peut être mis à jour de façon informatique. Il n'en faut pas plus pour que John Doe et Jane Odd,
nos deux apprentis hackers, écrivent un petit programme qui met à jour automatiquement
le tableau d'honneur avec leur nom.
Malheureusement, la classe
HonorBoard n'est pas thread safe, donc le code
fait n'importe quoi.
-
Rappeler ce que veut dire qu'une classe n'est pas thread-safe.
-
Expliquer pourquoi la classe HonorBoard n'est pas thread safe.
Si vous ne voyez pas, faite un grep "John Odd" sur la sortie du programme.
Rappel général: un test qui plante indique un problème, un test qui ne plante pas
n'indique rien du tout.
-
Modifiez le code de la classe HonorBoard pour la rendre thread-safe
en utilisant des blocs synchronized.
Pensez à vérifier avec grep sur la sortie comme précédemment
(pendant plusieurs minutes).
-
Maitenant que votre classe est thread-safe, peut-on remplacer la ligne:
System.out.println(board);
par la ligne:
System.out.println(board.getFirstName() + ' ' + board.getLastName());
avec les deux getters définis comme habituellement
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
Exercice 2 - Tableau d'honneur (2)
Reprendre le code de la classe
HonorBoard de l'exercice précédent.
On cherche maintenant à remplacer les usages du mot-clé
synchronized par un verrou ré-entrant
du package
java.util.concurrent.lock.
-
Rappeler ce que ré-entrant veut dire.
-
Rendre la classe HonorBoard thread-safe en utilisant un verrou ré-entrant.
Attention à bien libérer le verrou si une exception est levée.
Exercice 3 - Le déjeuner des philosophes
La situation est la suivante :
Cinq philosophes (initialement mais il peut y en avoir beaucoup plus) se trouvent autour d'une table ronde;
chaque philosophe a devant lui un plat de spaghetti et entre chaque assiette se trouve une fourchette.
Pour pouvoir manger, un philosophe doit prendre deux fourchettes, celle à sa droite et celle à sa gauche.
Un de vos collègues propose le code suivant:
-
Quel est le problème du code ci-dessus ?
Dans quelle condition se produit-il ?
Note: vous avez le droit de l'exécuter si vous ne voyez pas.
-
Est-il possible d'avoir deux philosophes qui mangent en même temps ?
Est-ce quelque chose qui est normal ou pas ?
-
Modifier le code pour corriger le problème.
Note: il existe deux façons, une plus belle que l'autre :)
© Université de Marne-la-Vallée