Devinette sur les ThreadLocal

Avant la parution d’une série d’articles sur la classe ThreadLocal, je vous propose une série de 5 petites devinettes java (des javanettes on va dire), sur un même code. Une connaissance poussée de java et de la classe ThreadLocal peut-être nécessaire pour trouver les solutions et surtout les justifier, mais c’est aussi l’occasion de découvrir, qui sait, les dessous d’une classe méconnue. N’hésitez pas à poster vos idées de réponses sous forme de commentaires.

Soient les classes Data (une classe qui prend en mémoire le nombre de Megaoctets passé en argument), A, B et C dont le code est ci-dessous. Vous constaterez qu’elle sont fortement similaires


1
2
3
4
5
6
public class Data {  
  private byte[] datas = null;  
  public Data(int sizeInMegs){  
    datas = new byte[1024*1024*sizeInMegs];  
  }  
}

1
2
3
4
5
6
7
8
public class A {  
  private ThreadLocal tl = new ThreadLocal();  
  Data data;  
  public A(Data data){  
    tl.set(this);  
    this.data=data;  
  }  
}

1
2
3
4
5
6
7
8
public class B {  
  private static ThreadLocal tl = new ThreadLocal();  
  private Data data;  
  public B(Data data){  
    this.data=data;  
    tl.set(this);  
  }  
}

1
2
3
4
5
6
7
public class C {  
  Data data;  
  ThreadLocal  tl = new ThreadLocal ();  
  public C(Data data){  
    tl.set(data);  
  }  
}

Ces codes sont utilisés de 5 manières différentes par le main suivant:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
  public static void main(String[] args) throws Exception {
    final int size = ....;
    if (args[0].equals("A")){
      while(true)
        new A(new Data(size));
    } else if (args[0].equals("B")){
      while(true)
        new B(new Data(size));
     
    } else if (args[0].equals("C")){
      while(true)
        new C(new Data(size));
    } else if (args[0].equals("D")){
      while (true){
        new Thread(){
          @Override
          public void run() {
            new A(new Data(size));
          }
         
        }.start();
        Thread.sleep(100);
      }
    } else if (args[0].equals("E")){
      while (true){
        new Thread(){
          @Override
          public void run() {
            new B(new Data(size));
          }
         
        }.start();
        Thread.sleep(100);
      }
    }  
  }

En supposant que le code du main est exécuté sur une JVM 1.6.0_11 dont la mémoire est volontairement limitée à 64M et que la variable size est comprise entre 2 et 25, quel sera son comportement si on lui passe successivement les paramètres A à E? Et surtout, pourquoi?

  • Avec A.
    1. java.lang.OutOfMemoryError;
    2. Le code restera en boucle infinie;
    3. Ça dépend de size;
    4. Stéphanie de Monaco!
  • Avec B.
    1. java.lang.OutOfMemoryError;
    2. Le code restera en boucle infinie;
    3. Ça dépend de size;
    4. C’est du à l’aïl?
  • Avec C.
    1. java.lang.OutOfMemoryError;
    2. Le code restera en boucle infinie;
    3. Ça dépend de size;
    4. I see 44510 people
  • Avec D.
    1. java.lang.OutOfMemoryError;
    2. Le code restera en boucle infinie;
    3. Ça dépend de size;
    4. 42.
  • Avec E.
    1. java.lang.OutOfMemoryError;
    2. Le code restera en boucle infinie;
    3. Ça dépend de size;
    4. 0x5f3759d5.

Aide de jeu en page suivante.

3 réflexions au sujet de « Devinette sur les ThreadLocal »

  1. tiens je viens de découvrir qu’en utilisant le lien vos notifications, on pouvait aussi voir les réponses blogs comme celui ci :)
    Et du coup j’ai découvert un message non lu ^^
    en tous cas merci pour ces questions qui m’ont clairement montré que je pouvais repartir étudier :D

Laisser un commentaire