problème avec synchronized - Java - Programmation
Marsh Posté le 21-03-2004 à 10:26:52
Je ne sais pas ... je ne vois pas pourquoi ... j'ai pas de boucles infinies ... il y a même pas de boucles dans la méthode en question, juste du If et du Else :s Franchement, c'est dur de faire plus simple ...
Si un thread attend indéfiniment sont tour, j'avoue que je ne vois pas pourquoi
Marsh Posté le 21-03-2004 à 10:28:50
Fuadrait voir ton code mais si t'as 2 objets qui essaient de se synchroniser l'un par rapport à l'autre avec des prises de lock inversées, ça peut bloquer.
Marsh Posté le 21-03-2004 à 10:33:06
je crois que je vois l'idée ...
Parmi les threads que j'ai lancés, il y en a un qui appellera
synchronized(a) {
synchronized(b) {
a.methode(b);
}
}
et un autre qui est susceptible de faire
synchronized(b) {
synchronized(a) {
b.methode(a);
}
}
mais dans ce cas, pourquoi on n'a pas juste une attente de liberation des objets utilisés par le 1er thread servi ???
Marsh Posté le 21-03-2004 à 11:06:02
parce que si le premier thread prend a et attend b alors que le second prend b en attendant a, ils risquent de s'attendre longtemps (étreinte fatale).
Marsh Posté le 21-03-2004 à 11:12:13
Comment faire alors, pour préciser un ordre d'exécution explicite ??? Car les deux actions doivent être effectuées quand même
Marsh Posté le 21-03-2004 à 11:19:48
si tu es dans un dans un IDE passe en mode débug et quand tu programme se bloque met le en pause et regarde où sont bloqués tes threads. Sinon, si tu lances ton prg dans un shell, tu peux envoyer un signal au process pour lui demander d'afficher les stacktrace des threads. Mais je ne me souviens plus de la commande Ctrl+ kekchose ...
Marsh Posté le 21-03-2004 à 11:22:41
tu rajoutes un 3ème objet qui sera synchronyzed par tes 2 taches avant de tenter de locker a ou b par exemple.
Code :
|
Ou alors tu change complètement de pattern de synchronisation.
Marsh Posté le 21-03-2004 à 11:32:30
oki merci, ça a l'air de marcher ça... je vais filer ça à ma binôme, qui a l'art de faire planter mes progs Comme ça je serai vite fixé Mici m'sieur
Marsh Posté le 21-03-2004 à 17:16:22
la synchronisation, ça se teste pas, ça se prouve au papier/crayon/vérificateur de code.
Marsh Posté le 21-03-2004 à 19:07:22
nraynaud a écrit : la synchronisation, ça se teste pas, ça se prouve au papier/crayon/vérificateur de code. |
boh, doit y'avoir moyen de faire des unit tests (certes un peu tordus mais bon)
Marsh Posté le 21-03-2004 à 19:19:13
the real moins moins a écrit : boh, doit y'avoir moyen de faire des unit tests (certes un peu tordus mais bon) |
oué, et tu fais comment la couverture là-dessus ?
Marsh Posté le 21-03-2004 à 19:31:15
nraynaud a écrit : oué, et tu fais comment la couverture là-dessus ? |
j'ai dit "doit y'avoir moyen", pas "je sais comment faire"
mais c'est vrai que bon
Marsh Posté le 21-03-2004 à 19:36:45
the real moins moins a écrit : j'ai dit "doit y'avoir moyen", pas "je sais comment faire" |
Par des méthodes formelles, mais puisque l'on passe en formel, autant faire toute la preuve d'un seul coup.
J'ai déjà posté un lien sur un outil de ce type.
Marsh Posté le 22-03-2004 à 19:10:48
benou a écrit : si tu es dans un dans un IDE passe en mode débug et quand tu programme se bloque met le en pause et regarde où sont bloqués tes threads. Sinon, si tu lances ton prg dans un shell, tu peux envoyer un signal au process pour lui demander d'afficher les stacktrace des threads. Mais je ne me souviens plus de la commande Ctrl+ kekchose ... |
ctrol + pause?
Marsh Posté le 22-03-2004 à 19:18:08
veryfree a écrit : |
c'est un truc à mettre dans la java faq ca !
ce qui est sympa c'est quand tu as un deadlock, ca te l'indique
Marsh Posté le 22-03-2004 à 19:20:25
benou a écrit : |
c'est toi qui me l a appris ce truc hein
source
Marsh Posté le 22-03-2004 à 19:23:37
veryfree a écrit : |
je me souvenais que j'avais aidé quelqu'un avec ce truc
je me fais vieux, je perds la mémoire
Marsh Posté le 22-03-2004 à 19:38:08
veryfree a écrit : j'ai edité |
déjà a l'époque je m'en souvenais plus
faut dire que ca sert pas non plus tous les jours ce truc ...
Marsh Posté le 22-03-2004 à 19:43:51
veryfree a écrit : en tout ca pour moi ce fut tres efficace |
clair !
quand je me relis je me demande comment je suis arrivé à trouvé ton problème à partir de ca . j'étais en forme ce jour là
Marsh Posté le 22-03-2004 à 22:04:41
Le jour où je trouve une étreinte fatale dans un de mes logiciels, je suis pas près de dormir !
On fois qu'on en a trouvé une, qui prouve que c'est pas truffé de conneries ?
Marsh Posté le 15-04-2004 à 16:25:59
Faire des synchronized en cascade c'est jamais bon.
Il faudrait avoir un point d'entrée unique pour l'obtention de resources partagées.
Marsh Posté le 16-04-2004 à 22:37:48
Sinon je pense qu'en changeant l'ordre ça devrait marcher :
synchronized(a) {
synchronized(b) {
a.methode(b);
}
}
synchronized(a) {
synchronized(b) {
b.methode(a);
}
}
nan ?
Marsh Posté le 21-03-2004 à 10:01:34
Bonjour à tous
Voilà, j'ai une classe pour laquelle j'utilise l'interface Runnable, pour pouvoir gérer des threads multiples.
J'avais quelques bugs, que je pense dûs à des accès simultanés par plusieurs threads à un même objet. Donc forcément, je regarde ma doc, et je tombe sur synchronized()
Je fais donc un truc du genre
synchronized(a) {
synchronized(b) {
a.methode(b);
}
}
mais là, je constate que mon programme se bloque maintenant (ça freeze) ... quelqu'un aurait-il une explication possible à me donner ???