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.
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.