Question de synchronisation pour des classes différentes - Java - Programmation
Marsh Posté le 28-01-2005 à 16:24:19
mr_mat a écrit : |
je pense qu'il y a méprise sur le mot clé synchronize et ce que tu veux faire là ...
tu veux faire quoi en fait ?
Marsh Posté le 28-01-2005 à 16:32:07
pour shématiser :
Code :
|
sachant que je veux pas que Bupdate et Cupdate soient excutées en me^me temps (en fait ca serait plus des bouts de code dans des fonctions que des fonction entières)
sachant aussi que B et C sont dans des threads différents (en fait c'est des behaviours threadées pour du SMA mais c pas trop important), sachant aussi que j'ia deja pensé que c'était posible de faire avec un flag dans la classe A ou aussi en mettant les fonctions d'update dans la classe A mais mon code est tel que j'aimerai éviter ces solutions.
merci
Marsh Posté le 28-01-2005 à 17:13:17
Tu peux acquérir un lock sur un objet en entrant dans Bupdate et Cupdate.
Qq ch comme ça ?
Marsh Posté le 28-01-2005 à 17:15:05
je sais pas je connais pas le lock mais ca peut le faire peut être
comemnt ca marche le lock ? (grosso modo...)
Marsh Posté le 28-01-2005 à 17:26:31
http://java.sun.com/docs/books/tut [...] itors.html
Marsh Posté le 28-01-2005 à 17:39:29
ca m'oblige a mettre les fonctions Bupdate et Cupdate dans la classe A si j'ai bien compris ? c un peu lourd car ca demande pas mal de données des classes B et C mais si c la seule solution tant pis je le mettrai en place
Marsh Posté le 28-01-2005 à 23:02:30
Sorry, ma faute
Tu as bien compris, mais cette doc ne va pas assez loin. Il y a moyen de faire comme tu dis avec un synchronized(myObject).
Je t'ai fait une petite démo à la volée pour me faire pardonner. J'espère que je ne me plante pas trop...
L'équivalent de ta classe A :
Code :
|
Remarque le private static Object semaphore = new Object(); : il n'existera dans la demo qu'une seule instance de cet object. Attention, le fait de la déclarer static ne suffit pas à le rendre unique, mais c'est une autre histoire. Ici, on s'assure qu'il est bien unique.
Ensuite, plutôt que de rendre synchronized toute une méthode, je ne sérialise que l'accès à un bout de code à l'aide de synchronized (semaphore).
Pour faire simple, un sémaphore est un flag utilisé pour synchroniser des threads. Il est représenté par l'objet du même nom.
Ensuite, pour attaquer le morceau, ta classe B et ta classe C (désolé, chez moi, c'est A et B ).
Code :
|
Idem pour B, mutatis mutandis.
Et de quoi tester :
Code :
|
Ce qu'il en sort :
About to acquire lock: A1
Entered critical section: A1
About to acquire lock: A2
About to acquire lock: B1
Exit critical section: A1
Entered critical section: A2
Exit critical section: A2
Entered critical section: B1
About to acquire lock: A1
About to acquire lock: A2
Exit critical section: B1
Entered critical section: A1
About to acquire lock: B1
Exit critical section: A1
Entered critical section: A2
Exit critical section: A2
Entered critical section: B1
About to acquire lock: A1
About to acquire lock: A2
Exit critical section: B1
Entered critical section: A1
Exit critical section: A1
Entered critical section: A2
About to acquire lock: B1
About to acquire lock: A1
Exit critical section: A2
Entered critical section: B1
Exit critical section: B1
Entered critical section: A1
About to acquire lock: A2
About to acquire lock: B1
Exit critical section: A1
Entered critical section: A2
About to acquire lock: A1
Exit critical section: A2
On constate que ça se bouscule au portillon, mais qu'il n'y a jamais qu'un seul thread (A1, A2 ou A3) à l'intérieur de la bête à un moment donné.
Tu peux mettre un plus long sleep dans Sync.foo, et tu verras que les autres threads attendent sagement dehors.
Ca s'appelle sérialiser l'accès à une section critique ou qq ch comme ça.
N.B. Tu n'es pas obligé de travailler avec des static sur Sync comme je l'ai fait par facilité. Tu peux très bien instancier Sync une seule fois dans ConcurrentTest et le passer en paramètre à A et B.
Marsh Posté le 28-01-2005 à 23:03:50
Si tu veux en savoir plus : Thinking in Java
Marsh Posté le 28-01-2005 à 23:17:40
merci beaucoup !
je me souvien maintenant j'avais fait ca il y a 3 ans dans un stage ! mais là j'avai completement oublié !!!
merci si tu était pas là j'aurai grave galéré pour retrouver comment faire ca étant donné que je me souvenai plus du mot "sémaphore"
Marsh Posté le 28-01-2005 à 16:17:00
salut.
je develloppe un prog qui a deux thread différentes, correspodnant chacune a un objet de classe différente.
j'aimerai synchroniser une partie d'un objet avec une partie de l'autre.
si je ne m'abuse le mot clé synchronised n'est pas indiqué pour cette situation car il permet juste de synchroniser deux instances différentes de la même classe (a moins que qqchose m'échappe)
alors quelle serait la solution ?
merci