Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1484 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  Question de synchronisation pour des classes différentes

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Question de synchronisation pour des classes différentes

n°964765
Profil sup​primé
Posté le 28-01-2005 à 16:17:00  answer
 

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

mood
Publicité
Posté le 28-01-2005 à 16:17:00  profilanswer
 

n°964779
the real m​oins moins
Posté le 28-01-2005 à 16:24:19  profilanswer
 

mr_mat a écrit :


j'aimerai synchroniser une partie d'un objet avec une partie de l'autre.


je pense qu'il y a méprise sur le mot clé synchronize et ce que tu veux faire là ... :heink:
tu veux faire quoi en fait ?


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°964785
Profil sup​primé
Posté le 28-01-2005 à 16:32:07  answer
 

pour shématiser :
 

Code :
  1. class A
  2. {
  3. donnes Truc;
  4. }
  5. class B
  6. {
  7. ref à class A;
  8. fonc Bupdate(); // met a jour les donnees Truc de la classe A
  9. }
  10. class C
  11. {
  12. ref à class A;
  13. fonc Cupdate(); // met a jour les donnees Truc de la classe A
  14. }


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

n°964834
sircam
I Like Trains
Posté le 28-01-2005 à 17:13:17  profilanswer
 

Tu peux acquérir un lock sur un objet en entrant dans Bupdate et Cupdate.
 
Qq ch comme ça ?


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°964836
Profil sup​primé
Posté le 28-01-2005 à 17:15:05  answer
 

je sais pas je connais pas le lock mais ca peut le faire peut être :)
 
comemnt ca marche le lock ? (grosso modo...)


Message édité par Profil supprimé le 28-01-2005 à 17:15:22
n°964852
sircam
I Like Trains
Posté le 28-01-2005 à 17:26:31  profilanswer
 

http://java.sun.com/docs/books/tut [...] itors.html


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°964877
Profil sup​primé
Posté le 28-01-2005 à 17:39:29  answer
 

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

n°965105
sircam
I Like Trains
Posté le 28-01-2005 à 23:02:30  profilanswer
 

Sorry, ma faute  :jap:
 
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 :
  1. public class Sync {
  2.     private static Object monitor = new Object();
  3.     public static void foo () {
  4.         System.out.println("About to acquire lock: " + Thread.currentThread().getName());
  5.         synchronized (monitor) {
  6.             System.out.println("Entered critical section: " + Thread.currentThread().getName());
  7.             try {
  8.                 Thread.sleep(1);
  9.             }
  10.             catch (InterruptedException e) {
  11.                 //
  12.             }
  13.             System.out.println("Exit critical section: " + Thread.currentThread().getName());
  14.         }
  15.     }
  16. }


 
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 [:airforceone]).  
 

Code :
  1. public class A extends Thread {
  2.     public void run () {
  3.         while (true) {
  4.             Sync.foo();
  5.             try {
  6.                 Thread.sleep(1);
  7.             }
  8.             catch (InterruptedException e) {
  9.                 //
  10.             }
  11.         }
  12.     }
  13. }


 
Idem pour B, mutatis mutandis.
 
Et de quoi tester :
 

Code :
  1. public class ConcurrentTest {
  2.     public static void main(String[] args) {
  3.         A a1 = new A();
  4.         A a2 = new A();
  5.         B b1 = new B();
  6.         a1.setName("A1" );
  7.         a2.setName("A2" );
  8.         b1.setName("B1" );
  9.         a1.start();
  10.         a2.start();
  11.         b1.start();
  12.     }
  13. }


 
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.
 
 [:crosscrusher]  
 


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°965109
sircam
I Like Trains
Posté le 28-01-2005 à 23:03:50  profilanswer
 

Si tu veux en savoir plus : Thinking in Java


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°965132
Profil sup​primé
Posté le 28-01-2005 à 23:17:40  answer
 

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"

mood
Publicité
Posté le 28-01-2005 à 23:17:40  profilanswer
 

n°965138
sircam
I Like Trains
Posté le 28-01-2005 à 23:22:14  profilanswer
 

:jap:


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  Question de synchronisation pour des classes différentes

 

Sujets relatifs
java JADE (multi agent), question sur les behaviours en parrallèleQuestion débutant - Optimiser type de donnée Number (Oracle)
petite question (form et php)petite question sur erreur gdb
Question wiki pour doc utilisateurDLL et destructeur de classes
Question de conception .... je pecheModification de variable passée en paramètre (question de noob)
minWG, question de débutantQuestion sur NATURAL JOIN
Plus de sujets relatifs à : Question de synchronisation pour des classes différentes


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR