:: Enseignements :: ESIPE :: E4INFO :: 2018-2019 :: Collections Concurrentes ::
[LOGO]

Examen de Collection Concurrente


À lire absolument

Tout ce que vous devez rendre devra obligatoirement être placé dans le répertoire EXAM à la racine de votre compte ; sinon, ce n'est pas récupéré et vous aurez 0.

La javadoc est accessible en local : file:///usr/local/apps/java11/docs/api/index.html.

Exercice 1 - Fork/Join Tree

On cherche à écrire une méthode reduceParallel qui permet de calculer en parallèle n'importe qu'elle réduction en utilisant le principe de fork/join. sur un arbre.

  1. Ecrire une méthode reduceSequential(E initialElement, BinaryOperator<E> merger) qui renvoie initialElement si aucun élément est présent dans l'arbre, et qui si applique itérativement la fonction merger sur les éléments successivement.
  2. Ecrire un main de test qui fait la somme des élements de 0 à 1 000 000 si ceux-ci sont stocké dans un arbre de type Tree<Integer>.
    Pour cela, générer une liste des élements de 0 à 1 000 000, permuter les avec Colections.shuffle (avec un Random initialisé à 0), insérer les dans l'arbre et enfin fait la somme en appelant reduceSequential.
  3. Pourquoi on vous a demandez de faire un Collections.shuffle avant d'insérer les élements dans l'arbre à la question précédente ?
    Répondez en ajoutant un commentaire dans le code.
  4. Ecrire une méthode reduceParallel(int threshold, E initialElement, BinaryOperator<E> merger) qui découpe l'arbre en sous-arbre, et fait le calcul de chaque sous-arbre en parallèle en utilisant le ForkJoinPool par défaut.
    Si la taille du sous-arbre est inférieur à threshold le calcul doit se faire de façon séquentiel.
    Note: si vous regardez le code chaque sous-arbre connait sa taille.
  5. Tester en modifiant votre main pour utiliser reduceParallel avec un threshold de 10 000 élements.

Exercice 2 - Fin de party pour les Averageurs

On cherche à implanter une classe thread-safe AverageVote qui possède un constructeur et deux méthodes, le constructeur prend en paramètre le nombre de threads qui vont voter, une méthode vote qui permet de voter un entier, la thread qui fait le vote étant bloquée tant que toutes les autres threads n'ont pas votées. Et une méthode average qui renvoie la moyenne des votes ou OptionalDouble.empty si il n'y a pas de vote.

Le code a été commencé par Kenny qui est malheureusement passé sous un bus, vous devez donc reprendre le flambeau et finir le code.

  1. Expliquer pourquoi (en commentaire dans le code) le code de Kenny à un problème de publication et corriger le code.
  2. Faite en sorte que le code soit thread-safe en finissant l'implantation de Kenny.
    Note: Kenny, paix à so âme, a commencé à utiliser des ReentrantLock, continuer à les utiliser.
  3. Vérifier que le main fonctionne correctement une fois que vous aurez remplacer le TODO par le code correct.
  4. Ajouter un commentaire dans le main pour expliquer à quoi sert l'appel à Thread.onSpinWait().
  5. On souhaite faire en sorte que la méthode average soit lock-free, comme cette méthode manipule deux champs qui doivent être mis à jour en même temps, c'est pas super facile sauf si on créé une classe non mutable Value qui va stocker les valeurs des deux champs car dans ce cas, lors d'une mise à jour, il vous suffira de mettre à jour la seule référence sur un object de type Value.
    Implanter la méthode average de façon lock free.