:: Enseignements :: ESIPE :: E4INFO :: 2017-2018 :: Concurrence ::
![[LOGO]](http://igm.univ-mlv.fr/ens/resources/mlv.png) | 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.
-
Qu'est ce qu'une classe thread-safe ?
-
À quoi sert la méthode join de la classe java.lang.Thread ?
-
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 ?
-
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 ?
-
Quelles sont les deux raisons pour lesquelles il faut mettre les appels
à wait à l'intérieur d'une boucle while.
-
Que veut dire ré-entrant ? Un block synchronized est-il réentrant ?
-
À quoi correspond le paramètre corePoolSize de la classe ThreadPoolExecutor ?
-
À 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
}
}
-
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.
-
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.
-
Indiquer un second code pour la méthode main en utilisant un Executor.
-
Indiquer un code pour la classe Sync en utilisant le mot clé synchronized.
-
Indiquer un code pour la classe Sync en utilisant un verrou du package
java.util.concurrent.
-
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
}
}
-
Indiquer un code pour la classe PermitSync en utilisant le mot clé synchronized.
-
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).
-
L'implantation devra être lock-free, ou si vous préférez, l'implantation devra utiliser uniquement des opérations atomiques.
-
Pour éviter de créer un nouveau tableau à chaque ajout (ce qui consommerait trop de mémoire),
à chaque thread accédant au tableau, on va associer une ArrayList spécifique à cette thread. Lors d'un ajout, les éléments vont être stockés dans cette liste.
-
Si la liste est pleine, c'est à dire, si le nombre d’éléments dans la liste spécifique à une thread
est supérieur à un nombre prédéfini d’éléments threadLocalAllocatorSize
indiqué lors de la construction d'une instance de la classe MostlyLocalList,
alors les éléments de la liste spécifique à une thread seront recopiés dans le tableau
dynamique global et la liste locale sera vidée.
-
Pour tester, vous rajouterez une méthode size qui renvoie la taille du tableau global.
-
La méthode flush permet de forcer à vider la liste locale de la thread courante
dans le tableau dynamique global. De plus, l'appel à cette méthode libérera toutes les
ressources en mémoire liées au stockage de la liste spécifique à la thread courante.
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.
© Université de Marne-la-Vallée