Question de synchronisation pour des classes différentes

Question de synchronisation pour des classes différentes - Java - Programmation

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

Reply

Marsh Posté le 28-01-2005 à 16:17:00   

Reply

Marsh Posté le 28-01-2005 à 16:24:19    

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

Marsh Posté le 28-01-2005 à 16:32:07    

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

Reply

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 ?


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

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


Message édité par Profil supprimé le 28-01-2005 à 17:15:22
Reply

Marsh Posté le 28-01-2005 à 17:26:31    

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


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

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

Reply

Marsh Posté le 28-01-2005 à 23:02:30    

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}
Reply

Marsh Posté le 28-01-2005 à 23:03:50    

Si tu veux en savoir plus : Thinking in Java


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

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"

Reply

Marsh Posté le 28-01-2005 à 23:17:40   

Reply

Marsh Posté le 28-01-2005 à 23:22:14    

:jap:


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

Sujets relatifs:

Leave a Replay

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