problème avec synchronized

problème avec synchronized - Java - Programmation

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 ???

Reply

Marsh Posté le 21-03-2004 à 10:01:34   

Reply

Marsh Posté le 21-03-2004 à 10:19:24    

deadlock ?

Reply

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

Reply

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.

Reply

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 ???

Reply

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).


---------------
trainoo.com, c'est fini
Reply

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 :(

Reply

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 ...

Reply

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 :
  1. synchronized(c){
  2.   synchronized(a){
  3.     synchronized(b){
  4.       ...
  5.     }
  6.   }
  7. }


 
 
Ou alors tu change complètement de pattern de synchronisation.


---------------
trainoo.com, c'est fini
Reply

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 :p Comme ça je serai vite fixé ;) Mici m'sieur

Reply

Marsh Posté le 21-03-2004 à 11:32:30   

Reply

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.


---------------
trainoo.com, c'est fini
Reply

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)

Reply

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 ?


---------------
trainoo.com, c'est fini
Reply

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 [:meganne]

Reply

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.


---------------
trainoo.com, c'est fini
Reply

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?

Reply

Marsh Posté le 22-03-2004 à 19:18:08    

veryfree a écrit :


ctrol + pause?


:jap:
 
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 :)


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 22-03-2004 à 19:20:25    

benou a écrit :


:jap:
 
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 :)


 
c'est toi qui me l a appris ce truc hein  [:veryfree]
 
 
source


Message édité par veryfree le 22-03-2004 à 19:21:44
Reply

Marsh Posté le 22-03-2004 à 19:23:37    

veryfree a écrit :


c'est toi quie me l a appris ce truc hein  [:veryfree]  


je me souvenais que j'avais aidé quelqu'un avec ce truc :whistle:  
 
je me fais vieux, je perds la mémoire [:serial coder]


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 22-03-2004 à 19:33:52    

j'ai edité :o

Reply

Marsh Posté le 22-03-2004 à 19:38:08    


déjà a l'époque je m'en souvenais plus [:ddr555]
 
faut dire que ca sert pas non plus tous les jours ce truc ...


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 22-03-2004 à 19:42:06    

en tout ca pour moi ce fut tres efficace [:joce]

Reply

Marsh Posté le 22-03-2004 à 19:43:51    

veryfree a écrit :

en tout ca pour moi ce fut tres efficace [:joce]


clair ! :)
 
quand je me relis je me demande comment je suis arrivé à trouvé ton problème à partir de ca [:mlc2]. j'étais en forme ce jour là [:dawa]


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 22-03-2004 à 19:45:32    

tu nous a tous epaté je crois :jap:

Reply

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 ?


---------------
trainoo.com, c'est fini
Reply

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.
 
 
 

Reply

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 ?

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed