(Simple)DateFormat et synchronisation

DateFormat et synchronisation (Simple) - Java - Programmation

Marsh Posté le 07-09-2004 à 12:41:15    

Salut,
 
Sur http://java.sun.com/j2se/1.4.2/doc [...] ormat.html je lis:

Citation :

Synchronization
 
Date formats are not synchronized. It is recommended to create separate format instances for each thread. If multiple threads access a format concurrently, it must be synchronized externally.
 


 
Quelqu'un pourrait-il m'en dire plus? Quelles pourraient etre les conséquences? Quelqu'un a-t-il déjà vécu le problème?
 
Merci d'avance


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 07-09-2004 à 12:41:15   

Reply

Marsh Posté le 07-09-2004 à 13:37:41    

je trouve pas ca pratique, une instance par thread :/
 
edit: [:drapo]


Message édité par uriel le 07-09-2004 à 13:37:52

---------------
IVG en france
Reply

Marsh Posté le 07-09-2004 à 13:44:19    

boah en meme temps ici y'a un imbécile qui a fait un  
public static SimpleDateFormat dateFormat = ...  
alors bon, faut pas s'étonner maintenant :o
 
(et je m'abstiendrai de nommer l'imbécile sus-mentionné :ange:)


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 07-09-2004 à 14:52:15    

http://jakarta.apache.org/commons/ [...] Utils.html
 
attention : le parse de FastDateFormat n'est pas implémenté : seulement le format ...


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

Marsh Posté le 07-09-2004 à 15:01:30    

benou a écrit :


attention : le parse de FastDateFormat n'est pas implémenté : seulement le format ...

ben moi je fais du parse, pas d'pot :D


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 07-09-2004 à 15:21:07    

the real moins moins a écrit :

ben moi je fais du parse, pas d'pot :D


dommage :)
 
fait un new à chaque fois, tant pis ... (moi c'est ce que je fais)


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

Marsh Posté le 07-09-2004 à 15:22:46    

ou je synchronise la methode qui utilise le dateFormat.
 
Là je viens d'essayer de produire le problème avec 500 threads, mais ça le fait pas [:mlc]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 07-09-2004 à 15:27:21    

bon jme demande si j'ai pas merdé dans mes faux threads moi :whistle:


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 07-09-2004 à 16:54:45    

le coup du sycnhronize moi j'hésiterais ... si c'est un objet "central", ca va te créer un méchant goulot d'étranglement ...


Message édité par benou le 07-09-2004 à 17:35:05

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

Marsh Posté le 07-09-2004 à 18:21:04    

légende urbaine :o
on parle d'une transaction en base qui locke un objet ou un truc du genre hein, juste un pauvre parse de date... jveux dire créer la nouvelle instance à chaque appel sera probablement au moins aussi couteux... nan? :o


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 07-09-2004 à 18:21:04   

Reply

Marsh Posté le 07-09-2004 à 18:32:56    

the real moins moins a écrit :

légende urbaine :o
on parle d'une transaction en base qui locke un objet ou un truc du genre hein, juste un pauvre parse de date... jveux dire créer la nouvelle instance à chaque appel sera probablement au moins aussi couteux... nan? :o


ben comme je te disais ca dépend. Si c'est une méthode d'un objet qui est fortement solicitée depuis différents threads, ca risque de ralentir globalement ton système.
 
j'ai jamais benché ce genre de truc, mais moi, je préfère limiter au maximum les ressources partagées ... Tant que je peux et que c'est pas trop gourmand en mémoire, chaque thread est indépendant et a ses propres données.


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

Marsh Posté le 07-09-2004 à 18:37:27    

ouais. mtnt que j'y pense c'est l'objet qui a ce DateFormat (et donc la methode que je voulais synchronizer) qui est lui meme threadé. donc suffirait que je vire le static, une instance de mon DateFormat par instance de mon Bidule ça sera bon, et je synchronize la methode des fois que y'aurait plusieurs appels depuis d'autres threads vers mon Bidule.
 


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 07-09-2004 à 18:45:59    

moi je synchronizerais pas dans ce cas, mais j'indiquerais que l'objet n'est pas thread-safe. Un peu comme c'est fait pour SimpleDateFormat, quoi ...


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

Marsh Posté le 07-09-2004 à 18:47:32    

et tu crois que je controle les threads de jboss moi? :p


Message édité par the real moins moins le 07-09-2004 à 18:47:40

---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 07-09-2004 à 18:48:22    

bon à part ça si qqun arrive à produire une erreur de parsing en faisant du multi thread avec un SimpleDateFormat partagé entre les threads ça m'interesse parce que moi j'y arrive pas :p


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 07-09-2004 à 18:49:12    

allez, je réessaie avec 50000 threads [:banzai]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 07-09-2004 à 18:59:56    

euh ouais ça marcherait ptet mieux si j'appelais Thread.start() au lieu de .run() [:kiki]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 07-09-2004 à 19:01:49    

[:forummp3]

Reply

Marsh Posté le 07-09-2004 à 19:04:12    

probleme reproduit.


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 07-09-2004 à 19:09:15    

Code :
  1. import java.text.ParseException;
  2. import java.text.SimpleDateFormat;
  3. import java.util.Date;
  4. public class TestDateFormat {
  5.     /* the devil responsible for our pains */
  6.     private static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss" );
  7.     /* some test date */
  8.     private String dateStr = "2004-07-09 14:16:18";
  9.     private TestDateFormat() {
  10.     }
  11.     private void proofOfEvil() {
  12.         int numThreads = 50;
  13.         Thread[] threads = new Thread[numThreads];
  14.         Pouet[] pouets = new Pouet[numThreads];
  15.         for (int t = 0; t < numThreads; t++) {
  16.             pouets[t] = new Pouet();
  17.             threads[t] = new Thread(pouets[t]);
  18.         }
  19.         System.out.println("created threads" );
  20.         for (int t = 0; t < threads.length; t++) {
  21.             threads[t].start();
  22.         }
  23.         System.out.println("started threads" );
  24.         System.out.println("finished running all threads" );
  25.         for (int t = 0; t < pouets.length; t++) {
  26.             Pouet pouet = pouets[t];
  27.             Date date = pouet.getDate();
  28.             String result = dateFormat.format(date);
  29.             if (!(dateStr.equals(result))) {
  30.                 System.out.println("!! date[" + t + "] = " + result + ", expected= " + dateStr);
  31.             }
  32.         }
  33.     }
  34.     private class Pouet implements Runnable {
  35.         private Date date;
  36.         public void run() {
  37.             try {
  38.                 for (int j = 0; j < 5000; j++) {
  39.                     date = dateFormat.parse(dateStr);
  40.                     String result = dateFormat.format(date);
  41.                     if (!(dateStr.equals(result))) {
  42.                         System.out.println("in thread !! j = " + j + ", result = " + result + ", expected=" + dateStr);
  43.                         return;
  44.                     }
  45.                 }
  46.             } catch (ParseException e) {
  47.                 e.printStackTrace();
  48.             }
  49.         }
  50.         public Date getDate() {
  51.             return date;
  52.         }
  53.     }
  54.     public static void main(String[] args) {
  55.         new TestDateFormat().proofOfEvil();
  56.     }
  57. }

on peut meme se manger des NullPointerException [:huit]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 07-09-2004 à 19:10:36    

(le getDate() et tout ça c'est parce qu'au début j'avais pas de boucle dans mon thread, je gardais juste un resultat par thread - et le thread etait donc tres court donc bon ça marchait pas trop.. bref :o )


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 07-09-2004 à 19:39:23    

the real moins moins a écrit :

et tu crois que je controle les threads de jboss moi? :p


j'ai pas dit ca ... mais tu devrais savoir si ton objet est partagé entre plusieurs threads ou non, et l'utiliser en fonction ...
 
j'avais cru comprendre que ce n'était pas le cas avec ce que tu avais dit dans le post au dessus ...


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

Marsh Posté le 07-09-2004 à 19:39:53    


 :heink:  
tu les croyais pas quand il te le disais dans la javadoc ?


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

Marsh Posté le 07-09-2004 à 19:59:25    

benou a écrit :

:heink:  
tu les croyais pas quand il te le disais dans la javadoc ?

bien sur que si mais je voulais voir le genre de problème que ça causait, concretement. (voir premier post du topic [:itm])


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 07-09-2004 à 20:00:38    

benou a écrit :

j'ai pas dit ca ... mais tu devrais savoir si ton objet est partagé entre plusieurs threads ou non, et l'utiliser en fonction ...
 
j'avais cru comprendre que ce n'était pas le cas avec ce que tu avais dit dans le post au dessus ...

dans le post au dessus je parlais probablement de mon machin pour reproduire le probleme. mais c'est vrai que je devrais probablement pouvoir savoir si l'objet sera partagé ou pas. cela dit jprefere me mettre à l'abri d'une config foireuse, par exemple


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 07-09-2004 à 20:27:45    

the real moins moins a écrit :

dans le post au dessus je parlais probablement de mon machin pour reproduire le probleme. mais c'est vrai que je devrais probablement pouvoir savoir si l'objet sera partagé ou pas. cela dit jprefere me mettre à l'abri d'une config foireuse, par exemple


mouais ... moi je préfère que ca se voir quand la config est foireuse ...


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

Marsh Posté le 07-09-2004 à 21:16:12    

j'te dis pas comme ça se voit vachement bien que la config est foireuse quans sans raison apparente t'as une date sur 1000 qui est parsée n'importe comment sans que ça lance la moindre exception [:itm]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 07-09-2004 à 21:19:47    

bien sur, je voulais dire le détecter à un autre endroit ...


Message édité par benou le 07-09-2004 à 21:20:47

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

Marsh Posté le 07-09-2004 à 21:21:51    

detecter koi ?


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 07-09-2004 à 21:27:36    


 
le probleme de config je pense


---------------
IVG en france
Reply

Marsh Posté le 07-09-2004 à 21:28:45    

ben c'est ce que j'ai cru deviner, mais si c'est ça euh je vais pas aller taper dans la config de jboss depuis mon code quand meme [:itm]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 07-09-2004 à 23:41:14    

:whistle:  
 
bin merde alors [:joce]


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 07-09-2004 à 23:43:27    

[:joce]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 08-09-2004 à 00:05:14    

suis peut etre un imbécile moi mais le jour où t'arriveras à gérer un Thread correctement on en reparlera :fuck:


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 08-09-2004 à 09:41:15    

the real moins moins a écrit :

ben c'est ce que j'ai cru deviner, mais si c'est ça euh je vais pas aller taper dans la config de jboss depuis mon code quand meme [:itm]


 
non masi tu peux detecter si elle convient pas. Apres c'est sur que t'es pas plus avance [:joce]


---------------
IVG en france
Reply

Marsh Posté le 08-09-2004 à 10:20:04    

je voulais juste dire que c'est souvent une mauvaise idée de prévoir des petits bout de sparadra un peu partout "pour le cas" où un objet serait mal utilisé. Mieux vaut prévenir la mauvaise utilisation ...


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

Marsh Posté le 08-09-2004 à 23:32:19    

Avec un threadlocal tu seras tranquille sans avoir besoin d instancier des  date tout le temps :
 
public class SafeFormat
{
   private static final ThreadLocal local = new ThreadLocal()
   {
      protected synchronized Object initialValue()
      {
         return new SimpleDateFormat();
      }
   };
   public static SimpleDateFormat get()
   {
      return (SimpleDateFormat)local.get();
   }
}
 
Avec ca tu es tranquille, ca va garder un objet SimpleDateFormat par thread et donc tu n auras pas de probleme de concurrence.
 
Pour utiliser c est simple :
 
SimpleDateFormat format = SafeFormat.get();


Message édité par julienv le 08-09-2004 à 23:33:04
Reply

Marsh Posté le 09-09-2004 à 08:28:38    

:jap:
 
je savais pas à quoi srevait ThreadLocale ... c'est plutot intéressant ... ca ouvre des perspectives ...
je me demande comment c'est géré en interne ...


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

Marsh Posté le 09-09-2004 à 10:42:36    

benou a écrit :

:jap:
 
je savais pas à quoi srevait ThreadLocale ... c'est plutot intéressant ... ca ouvre des perspectives ...
je me demande comment c'est géré en interne ...

haaaaan :o
 
oui c'est interessant, mais dans un contexte j2ee je suis pas sur que ça soit la chose la plus propre à faire :p


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 09-09-2004 à 11:15:58    


il n'y a pas de honte à ne pas savoir, il n'y a que honte à ne pas apprendre :o
 
je savais que ca permettait ce genre de truc, mais je pensais pas que c'était comme ca que ca s'utilisait ... c'est assez spécial...
Faudra que je me lise de la doc là dessus ...


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

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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