:: Enseignements :: ESIPE :: E4INFO :: 2020-2021 :: Collections Concurrentes ::
[LOGO]

Modèle de mémoire, publication et Opérations atomiques


Problème de publication, Opérations atomiques, VarHandle et CAS

Exercice 1 - Publication safe

  1. Expliquer ce qu'est le problème de publication ?
  2. 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.
  3. 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;
            }
            ...
          }
        
  4. 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;
            }
            ...
          }
        
  5. 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();
            }
            ...
          }
        
  6. 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

  1. Expliquer pourquoi le code de la classe CowList n'est pas thread-safe ?
  2. 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 !
  3. 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 ?
  4. 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...

  1. 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 ?
  2. 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.