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

Révisions - Examen de concurrence sur table (2017)


Aucun document est autorisé.

Exercice 1 - Questions de cours (7)

Répondez aux questions suivantes en deux ou trois phrases, pas plus, et SVP répondez à la question pas au mot-clef.

  1. Qu'est ce qu'une classe thread-safe ?
  2. À quoi sert la méthode join de la classe java.lang.Thread ?
  3. Le code suivant a-t-il un problème de publication ?
         public class Foo {
           private int a;
           private final long b;
           
           public Foo(int a, long b) {
             this.a = a;
             this.b = b;
           }
         }
        
    Si oui, pourquoi ? si non pourquoi ?
  4. Le code suivant a-t-il un problème de publication ?
         public class Foo {
           private volatile int a;
           private long b;
           
           public Foo(int a, long b) {
             this.a = a;
             this.b = b;
           }
         }
        
    Si oui, pourquoi ? si non pourquoi ?
  5. Quelles sont les deux raisons pour lesquelles il faut mettre les appels à wait à l'intérieur d'une boucle while.
  6. Que veut dire ré-entrant ? Un block synchronized est-il réentrant ?
  7. À quoi correspond le paramètre corePoolSize de la classe ThreadPoolExecutor ?
  8. À quoi sert la classe ThreadLocal ?

Exercice 2 - Sync (7)

On souhaite écrire une classe thread-safe Sync qui possède deux méthodes safe et inSafe. La méthode safe garantit qu'une seule thread peut exécuter le code d'un Supplier à la fois (et ce, quel que soit le Supplier). La méthode inSafe, renvoie vrai si une thread est en train d'exécuter un Supplier avec la méthode safe en même temps.

public class Sync<V> {
  public boolean inSafe() {
    // TODO
  }
  
  public V safe(Supplier<? extends V> supplier) throws InterruptedException {
    return supplier.get();  // TODO
  }
}
  
  1. Indiquer le code d'une classe Counter ayant une méthode count qui renvoie une valeur et incrémente celle-ci à chaque appel. Votre implantation devra utiliser la classe Sync et supposant qu'il existe déjà une implantation.
  2. Indiquer, de plus, le code du main de la classe Counter qui créé un compteur et deux threads qui chacune affiche les valeurs renvoyées par le compteur dans une boucle infinie.
  3. Indiquer un second code pour la méthode main en utilisant un Executor.
  4. Indiquer un code pour la classe Sync en utilisant le mot clé synchronized.
  5. Indiquer un code pour la classe Sync en utilisant un verrou du package java.util.concurrent.
  6. La méthode inSafe du code précédent peut être lock free. Proposer une nouvelle implantation pour la classe Sync avec une méthode inSafe lock free.

Exercice 3 - PermitSync (6)

On souhaite écrire une classe thread safe PermitSync qui possède une méthode safe. La méthode safe garantie qu'un nombre de threads inférieur ou égal à permits peuvent exécuter le code des Supplier en même temps (et ce quel que soit le Supplier).

public class PermitSync<V> {
  public PermitSync(int permits) {
    // TODO 
  }
  
  public V safe(Supplier<? extends V> supplier) {
    return supplier.get();  // TODO
  }
}
  
  1. Indiquer un code pour la classe PermitSync en utilisant le mot clé synchronized.
  2. Indiquer un code pour la classe PermitSync en utilisant un verrou du package java.util.concurrent.

Exercice 4 - MostlyLocalList (Tp noté 2012)

On souhaite écrire une implantation MostlyLocalList d'un tableau dynamique (comme ArrayList) permettant d'ajouter des éléments (et initialement, de parcourir les éléments avec un itérateur (méthode iterator) ayant une sémantique snapshot).

Implanter la classe MostlyLocalList. Pour tester votre code, créez, avec un ExecutorService, plusieurs threads qui ajoutent un nombre d’éléments aléatoire à une MostlyLocalList et vérifiez que la somme de ce qu'ajoutent les threads correspond bien à la taille de la MostlyLocalList finale.