J'ai du mal avec les synchronizations. Heeeelp

J'ai du mal avec les synchronizations. Heeeelp - Java - Programmation

Marsh Posté le 01-08-2003 à 17:11:45    

Bon, c'est surement très bateau, mais tant pis, ça me saoule, j'arrive pas.
Voila le bout de code suivant :

Code :
  1. public static void Log (LDSLevel _level, int _iMsgId, JLDSVisitor _visitor, int _iCounterValue, String _strMessage) {
  2.         // Si le niveau de log n'autorise pas le log de la priorité donnée, pas la peine de tenter
  3.         if (JLDSExploitLog.getInstance().s_exploitLogger.isEnabledFor(_level)) {
  4.             // Si le compteur à été initialisé, récupère la durée
  5.             long lDuree     = _visitor.stopCounter2GetValue();
  6.             SimpleDateFormat dateFormat = new SimpleDateFormat("HHmmssSSS" );
  7.             String strDuree = dateFormat.format(new Date (lDuree));
  8.             String counter;
  9.             if (_iCounterValue == JLDSExploitLog.NO_COUNTER)
  10.                 counter = "";
  11.             else
  12.                 counter = Integer.toString(_iCounterValue);
  13.             // Renseigne les infos utilisées par le PaternLayout
  14.             JLDSExploitLog.MDCPut (_visitor.getUtilisateur().toString(), _visitor.GetIpAdress(),
  15.                     _visitor.getCurrentDocum().toString(), _visitor.getCurrentAppli().toString(), strDuree, counter,
  16.                     Integer.toString(_level.toLdsInteger()), Integer.toString(_iMsgId));
  17.             // Envois de la demande de log
  18.             JLDSExploitLog.getInstance().s_exploitLogger.log(_level, StringUtils.MakeNoLongerThan(_strMessage, 255));
  19.             // Retire les infos utilisées par le PaternLayout
  20.             JLDSExploitLog.MDCRemove();
  21.         }
  22.     }

 
 
ça se passe dans nu singleton (JLDSExploitLog).
Cette méhode étant statique, dans une appli multi threadée, il faut que je synchronize qqch. Je voudrais synchroniser le moins possible, évidement, mais je n'sais pas comment me servir de ce "synchronized"...

Reply

Marsh Posté le 01-08-2003 à 17:11:45   

Reply

Marsh Posté le 01-08-2003 à 17:16:18    

Tu peux tenter de synchroniser sa classe (java.lang.Class).


Message édité par Krueger le 01-08-2003 à 17:18:13
Reply

Marsh Posté le 01-08-2003 à 19:03:06    

Ca depends si les objets d'autres classes utilisent ton singleton. Sinon tu peux faire :

Code :
  1. synchronized(this){
  2.     JLDSExploitLog.MDCPut(....
  3.     .....
  4.     JLDSExploitLog.MCDRemove();
  5. }


Mais je suis pas un pro de cs choses-là no plus.

Reply

Marsh Posté le 03-08-2003 à 10:58:00    

Krueger a écrit :

Tu peux tenter de synchroniser sa classe (java.lang.Class).


el_gringo, c'est aps évident à dire comme ca où tu dois placer ton bloc synchronized ... ca dépend de ce qui doit être executé en mono-threadé ...
 
 
Si ta méthode n'était pas statique, tu pourrait faire un bloc synchronized sur this comme le disait R3g ...
 
Souvent, quand la méthode est statique, comme on a pas de "this", on gère la synchronization sur l'objet Class de l'objet genre :  
 

Code :
  1. synchronized(leNomDeTaClasse.class){
  2.    .....
  3. }


mais perso j'aime pas comme méthode parce que cet objet class est atteignable de partout dans la JVM => rien n'empeche un autre objket ailleur dans le programme de se synchronizer sur ce même objet class (même si ce serait vraiment bizarre) et donc de flinguer le comportement de ton objet
 
Moi dans ces cas là, je déclarre un objet bidon qui servira de verrou :
 

Code :
  1. ...
  2. private static final Object lock = new Object();
  3. ...
  4.    synchronized(lock) {
  5.       ...
  6.    }
  7. ...


Message édité par benou le 03-08-2003 à 11:05:17

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

Marsh Posté le 04-08-2003 à 00:42:32    

El_gringo a écrit :

Je voudrais synchroniser le moins possible, évidement, mais je n'sais pas comment me servir de ce "synchronized"...

j'avais lu un article tres interessant à ce sujet ... qui en fait démystifiait le synchronized et son mythe(donc) associé à sa lenteur/lourdeur... j'essaie de le retrouver ;)
 
ha ben le voila:
http://www-106.ibm.com/developerwo [...] 04223.html


---------------
...
Reply

Marsh Posté le 04-08-2003 à 09:34:29    

benou a écrit :


Moi dans ces cas là, je déclarre un objet bidon qui servira de verrou :
 

Code :
  1. ...
  2. private static final Object lock = new Object();
  3. ...
  4.    synchronized(lock) {
  5.       ...
  6.    }
  7. ...




 
Mais ça, ça empêche un accès multi threadé à tous le contenu du bloc ? je croyais que ça empêchais juste à plusieurs threads d'opérer sur "lock" en meme temps...

Reply

Marsh Posté le 04-08-2003 à 09:47:05    

benou > :jap:
 
Wu gui > Excellent article. Ça me rappelle un certain Michael Jackson (pas sûr du nom, j'ai égaré le bouquin qui le citait) qui proposait deux règles en Java :
1. N'optimise pas.
2. N'optimise pas encore.
 
El_gringo > Que veux-tu dire par "opérer" ? Si c'est synchroniser dessus, c'est bien le cas, puisque cet objet est privé, en supposant qu'il n'ait pas de getter.

Reply

Marsh Posté le 04-08-2003 à 09:49:16    

Krueger a écrit :

benou > :jap:
 
Wu gui > Excellent article. Ça me rappelle un certain Michael Jackson (pas sûr du nom, j'ai égaré le bouquin qui le citait) qui proposait deux règles en Java :
1. N'optimise pas.
2. N'optimise pas encore.
 
El_gringo > Que veux-tu dire par "opérer" ? Si c'est synchroniser dessus, c'est bien le cas, puisque cet objet est privé, en supposant qu'il n'ait pas de getter.


 
Mais en synchronizant comme ça donc, j'empêche tout accès simultané daans ce bloc, c ça ?

Reply

Marsh Posté le 04-08-2003 à 09:55:29    

Oui oui c'est bien ça.

Reply

Marsh Posté le 04-08-2003 à 10:50:52    

El_gringo a écrit :


Mais ça, ça empêche un accès multi threadé à tous le contenu du bloc ? je croyais que ça empêchais juste à plusieurs threads d'opérer sur "lock" en meme temps...


 :heink: ca revient exactement au même tes 2 phrases ...
 
Chaque objet a un jeton. Quand un thread se synchronize sur un objet, il prend le jeton de l'objet et execute le bloc. Si un autre thread se synchronize sur le même objet, il doit attendre que l'autre thread ait relaché le jeton. Là il pourra le prendre, et executer le bloc, etc ....


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

Marsh Posté le 04-08-2003 à 10:50:52   

Reply

Marsh Posté le 04-08-2003 à 11:21:43    

benou a écrit :


 :heink: ca revient exactement au même tes 2 phrases ...
 
Chaque objet a un jeton. Quand un thread se synchronize sur un objet, il prend le jeton de l'objet et execute le bloc. Si un autre thread se synchronize sur le même objet, il doit attendre que l'autre thread ait relaché le jeton. Là il pourra le prendre, et executer le bloc, etc ....


 
Ouais, évidement. J'pensais un peu "tordu".
Ben, merci alors. :hello:

Reply

Marsh Posté le 04-08-2003 à 12:22:18    

Krueger a écrit :

Wu gui > Excellent article. Ça me rappelle un certain Michael Jackson (pas sûr du nom, j'ai égaré le bouquin qui le citait) qui proposait deux règles en Java :
1. N'optimise pas.
2. N'optimise pas encore.

[:sisicaivrai]
 
et puis il ne me semble pas que l'article dise de ne pas optimiser, mais simplement qu'il demystifie le synchronized. la synchro autour d'un objet comme la propose benou me parait claire, mais dans d'autre cas, certains pourrait arriver à du code totalement tordu pour... rien ou presque...
 


---------------
...
Reply

Marsh Posté le 04-08-2003 à 12:26:27    

Oui, mais ça allait dans le même sens à mon avis : optimiser seulement quand c'est nécessaire.

Reply

Marsh Posté le 04-08-2003 à 12:30:45    

euh mais en fait ta réponse était serieuse alors? c'est qui ce michael jackson? devrait changer de nom, ça fait pas serieux :p


---------------
...
Reply

Marsh Posté le 04-08-2003 à 14:00:05    

Arf, désolé, j'aurais du le préciser. :D Je m'en souviens justement parce qu'un tel nom dans ce milieu, ça marque forcément. D'après mes souvenirs, le bouquin dont je parle donne des conseils concernant les conventions de codage. C'est un bouquin en anglais.


Message édité par Krueger le 04-08-2003 à 14:02:23
Reply

Marsh Posté le 04-08-2003 à 14:27:58    

ok :D

Reply

Sujets relatifs:

Leave a Replay

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