[Java] Soucis de synchronisation
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 :
Code:
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);
}
}
}
} |
En gros, il boucle, regarde si on lui demande du boulot sinon il dort pendant 200 ms et ainsi de suite.
Le code de la méthode doSomeWork() se présente comme ceci :
Code:
1 2 3 4 5 6 7 8 9
|
private void doSomeWork()
{
synchronized(MySingleton.getInstance())
{
// work !
}
} |
On s'apperçoit que le "blocage" se fait sur le synchronized(MySingleton.getInstance()) (nous l'avons constaté au moyen de traces.)
Le MySingleton est, comme son nom l'indique un objet unique :
Code:
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;
}
} |
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).
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]