:: Enseignements :: ESIPE :: E4INFO :: 2012-2013 :: Java Réseau I - Concurrence et E/S ::
[LOGO]

TP noté de concurrence


Exercice 1 - BiasableSet

On souhaite implanter une classe BiasableSet (à base de HashSet) thread safe possèdant les opérations classique add, remove et contains ainsi que deux opérations spéciales takeBias et revokeBias.
L'idée est que l'on peut lié le BiasableSet à une thread particulière, au dira que le BiasableSet est biaisé vers cette thread. Dans ce cas, si une autre thread cherche à modifier le BiasableSet par add ou remove, celle-ci sera mis en attente tant que le biais n'aura pas été révoqué.
Une seule thread peut prendre le biais et seule la thread ayant pris le biais peut le révoquer.
Si aucune thread à pris le biais, la classe se comporte comme une HashSet thread-safe.
En voici le squelette.

Exercice 2 - MostlyLocalList

On souhaite écrire une implantation d'un tableau dynamique (comme ArrayList) permettant d'ajouter des élements et de parcourir les élements avec un iterateur (méthode iterator) ayant une sémantique snapshot.
De plus l'implantation devra être lock-free, si vous préféré, l'impleméntation devra utiliser uniquement des opérations atomiques.
Pour éviter de créer un nouveau tableau à chaque ajout ce qui va consommer trop de mémoire, chaque thread va se voir asocier une ArrayList spécifique à cette thread et lors d'un ajout, les élements vont être stocké dans cette liste. Si la liste est pleine, c-a-d, si le nombre d'élements dans la liste spécifique à une thread est supérieur à un nombre prédéfinie d'élements 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é dans le tableau dynamique globale et la liste locale sera vidé.
La méthode iterator renverra un itérateur sur le tableau dynamique globale, et donc ne renverra pas les élements stockées dans les listes spécifiques à chaque thread.
La méthode flush permet de forcer à vider la liste locale à la thread courante dans le tableau dynamique globale. 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 courrante.