:: Enseignements :: ESIPE :: E4INFO :: 2020-2021 :: Collections Concurrentes ::
![[LOGO]](http://igm.univ-mlv.fr/ens/resources/mlv.png) |
Modèle de mémoire, publication et Opérations atomiques
|
Problème de publication, Opérations atomiques, VarHandle et CAS
Exercice 1 - Publication safe
-
Expliquer ce qu'est le problème de publication ?
-
Le code suivant a un problème de publication, expliquer lequel.
public class Foo {
private String value;
public Foo(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
Indiquer code avec un main suceptible de montrer le problème de publication.
-
Le code suivant a-t'il un problème de publication ? Si oui comment le corriger ?
public class Person {
private String name;
private final int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
...
}
-
Le code suivant a-t'il un problème de publication ? Si oui comment le corriger ?
public class Person {
private String name;
private volatile int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
...
}
-
Le code suivant a-t'il un problème de publication ? Si oui comment le corriger ?
public class Person {
private final String name;
private final int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
new Thread(() -> {
System.out.println(this.name + " " + this.age);
}).start();
}
...
}
-
Le code suivant a-t'il un problème de publication ? Si oui comment le corriger ?
public class Person {
private final String name;
private final int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
new Thread(() -> {
System.out.println(name + " " + age);
}).start();
}
...
}
Exercice 2 - Copy On Write List
Le code ci-dessous est une implantation non-thread safe de la liste
-
Expliquer pourquoi le code de la classe CowList n'est pas thread-safe ?
-
Recopier la classe CowList dans une nouvelle classe LockFreeCowList
et modifier le code pour rendre la classe thread-safe en utilisant une implantation
lock-free basée sur la classe
VarHandle.
Attention à ce que la méthode size soit aussi thread safe !
-
On peut remarquer que si l'on commente la ligne suivante
var array = this.array;
dans la méthode add, le code compile toujours, pourtant
le code ne marche plus.
Expliquer ce qu'il se passe et pourquoi ?
-
Au lieu de déclarer le champ array volatile, on se propose de remplacer
var array = this.array;
par un appel à la méthode getVolatile sur le VarHandle.
Quel code doit-on écrire ?
La classe est-elle encore thread-safe ?
Exercice 3 - Liste chainée avec ajout en fin
On souhaite écrire une implantation de liste chaînée de chaînes de caractères
avec insertion à la fin, concurrente et n'utilisant ni section critique, ni verrou.
La liste devra posséder deux méthodes
addLast(E e) et
size()
permettant respectivement d'ajouter un élément en fin de la liste et
de retourner la taille de la liste.
Le code ci-dessous est une implantation non-thread safe de la liste
Détail d'implantation: pour éviter de gérer différemment le cas de la liste vide,
une liste est créée initialement avec un faux maillon contenant la valeur
null.
L'idée de l'algorithme concurrent est la suivante:
pour éviter toute synchronisation lors de l'ajout,
on récupère le maillon à la fin de la liste puis on
teste en utilisant une opération atomique si le maillon est
toujours la fin de la liste; si oui, on lui assigne le nouveau
maillon créé. Si ce n'est pas le dernier maillon, on
récupère de nouveau le maillon à la fin de la liste et
on recommence la même opération...
-
Recopier le code de la classe StringList dans
une classe LockFreeStringList qui va implanter une liste
thread-safe sans verrou.
Dans un premier temps, implanter la méthode addLast.
Pour cela vous utiliserez la classe VarHandle.
Comment doit-on modifier le code de size pour
que la méthode soit thread-safe ?
-
On souhaite améliorer la complexité de la méthode addLast
en maintenant, en plus d'une référence sur la tête de la liste
(head), une référence sur la queue de la liste
(tail).
Modifier l'implantation de addLast pour utiliser
le champ tail et le mettre à jour.
© Université de Marne-la-Vallée