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.
- java.lang.OutOfMemoryError;
- Le code restera en boucle infinie;
- Ça dépend de size;
- Stéphanie de Monaco!
- Avec B.
- java.lang.OutOfMemoryError;
- Le code restera en boucle infinie;
- Ça dépend de size;
- C’est du à l’aïl?
- Avec C.
- java.lang.OutOfMemoryError;
- Le code restera en boucle infinie;
- Ça dépend de size;
- I see 44510 people
- Avec D.
- java.lang.OutOfMemoryError;
- Le code restera en boucle infinie;
- Ça dépend de size;
- 42.
- Avec E.
- java.lang.OutOfMemoryError;
- Le code restera en boucle infinie;
- Ça dépend de size;
- 0x5f3759d5.
Aide de jeu en page suivante.
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
exact, un article doit suivre sur les Threadlocal (toujours en brouillon, désolé). Je posterais un commentaire quand il sera prêt.
Il manque un peu une correction
du coup seul un test permet d’obtenir les solutions