Bonjour à tous.
L'application sur laquelle je travaille présente un dysfonctionnement (un thread se "bloque" pendant 1~2 Heures... Puis reprend sa vie.)
Le thread en question se présente comme ceci :
En gros, il boucle, regarde si on lui demande du boulot sinon il dort pendant 200 ms et ainsi de suite.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 public run() { while (_running) { if (_workRequested) { doSomeWork(); } else { try { Thread.sleep(200); } catch (InterruptedException e) { treatInterruptedException(e); } } } }
Le code de la méthode doSomeWork() se présente comme ceci :
On s'apperçoit que le "blocage" se fait sur le synchronized(MySingleton.getInstance()) (nous l'avons constaté au moyen de traces.)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 private void doSomeWork() { synchronized(MySingleton.getInstance()) { // work ! } }
Le MySingleton est, comme son nom l'indique un objet unique :
Le phénomène étrange est que, ce singleton en question est "attaqué" par un nombre important de threads, qui eux ne se bloquent pas (contrairement au Thread cité plus haut).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 public class MySingleton { private static _instance = null; private MySingleton() { // Constructor } public static synchronized getInstance() { if (_instance == null) { _instance = new MySingleton(); } return _instance; } }
Les méthodes de ce singleton sont pour la plupart synchronized.
Mais voila, notre Thread en question arrive sur ce synchronized(MySingleton.getInstance()) et il y reste entre 1 & 2 heures (ce probème apparait de manière aléatoire, sinon ça ne serait pas drôle...) .
Donc je veux bien, cet objet singleton est attaqué par plusieurs Threads (peut être 10 au maximum), mais je ne comprend pas pourquoi mon Thread ne reçoit jamais "la priorité" ...
A noter que, aucun Thread n'a vu sa priorité modifiée par l'appel de méthode setPriority(int p)...
Et là je dois vous dire que je ne vois absolument pas ce qui se passe...
Si vous avez la moindre idée/remarque/critique, n'hésitez pas !! Merci
[Edit] Le fait que l'on tente d'effectuer un bloc synchronized en appelant la
méthode getInstance() du singleton qui elle même est synchronized peut-il poser problème?? [/Edit]
Partager