:: Enseignements :: ESIPE :: E4INFO :: 2016-2017 :: Concurrence ::
[LOGO]

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.

  1. Rappeler ce que veut dire qu'une classe n'est pas thread-safe.
  2. 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.
  3. 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).
  4. 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.

  1. Rappeler ce que ré-entrant veut dire.
  2. 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:

  1. 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.
  2. Est-il possible d'avoir deux philosophes qui mangent en même temps ?
    Est-ce quelque chose qui est normal ou pas ?
  3. Modifier le code pour corriger le problème.
    Note: il existe deux façons, une plus belle que l'autre :)