:: Enseignements :: ESIPE :: E4INFO :: 2011-2012 :: Soutien: Java et concurrence ::
![[LOGO]](http://igm.univ-mlv.fr/ens/resources/mlv.png) | Atomicité, CAS |
Exercice 1 - Concurrent array list
On souhaite implanter une liste permettant les accès concurrents donc thread-safe
utilisant un tableau comme stockage.
De plus, l'implantation ne devra pas utiliser de lock (on dit que l'implantation est lock-free).
L'idée est que lorsque l'on veut effectuer une modification de la liste, l'implantation va allouer
un nouveau tableau contenant les modifications plutôt que faire les modifications sur place
ce qui poserait des problèmes de concurrence.
Comme c'est un exercice, nous n'allons pas implanter toutes les méthodes de l'interface List
mais seulement add, get et size puis l'itérateur.
-
Expliquer ce qu'est un CAS (compare and set) et où l'on doit utiliser ici.
-
Ecrire add, get et size.
-
Implanter la méthode iterator qui renvoie un iterateur (concurrent donc).
Exercice 2 - LockFreeSet
On souhaite écrire une implantation d'un Set qui
soit thread-safe et lock-free.
L'implantation fonctionne comme une table de hachage de taille fixe utilisant un hachage ouvert
mais là ou habituellement on utilise une liste chainée pour stocker les élements
qui entre en collisions, on utilisera ici des tableaux secondaires pour
stocker les collisions.
Lors d'un ajout d'un élement, une fois l'index trouvé en fonction de la fonction
de hachage, on parcours le tableau secondaire pour voir si l'élement ne s'y trouve
pas, sinon on crée un nouveau tableau ayant une case supplémentaire,
on recopie les anciennes valeurs et on stocke ne nouvel élement dedans.
Lors d'une recherche, on parcours simplement le tableau secondaire.
-
Expliquer pourquoi le code n'est pas thread-safe.
-
Modifier le code pour qu'il soit thread-safe en utilisant
les opérations atomiques de la classe AtomicReferenceArray
et en particulier la méthode compareAndSet.
© Université de Marne-la-Vallée