DateFormat et synchronisation (Simple) - Java - Programmation
Marsh Posté le 07-09-2004 à 13:37:41
je trouve pas ca pratique, une instance par thread
edit:
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
(et je m'abstiendrai de nommer l'imbécile sus-mentionné )
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 ...
Marsh Posté le 07-09-2004 à 15:01:30
benou a écrit : |
ben moi je fais du parse, pas d'pot
Marsh Posté le 07-09-2004 à 15:21:07
the real moins moins a écrit : ben moi je fais du parse, pas d'pot |
dommage
fait un new à chaque fois, tant pis ... (moi c'est ce que je fais)
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
Marsh Posté le 07-09-2004 à 15:27:21
bon jme demande si j'ai pas merdé dans mes faux threads moi
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 ...
Marsh Posté le 07-09-2004 à 18:21:04
légende urbaine
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?
Marsh Posté le 07-09-2004 à 18:32:56
the real moins moins a écrit : légende urbaine |
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.
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.
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 ...
Marsh Posté le 07-09-2004 à 18:47:32
et tu crois que je controle les threads de jboss moi?
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
Marsh Posté le 07-09-2004 à 18:49:12
allez, je réessaie avec 50000 threads
Marsh Posté le 07-09-2004 à 18:59:56
euh ouais ça marcherait ptet mieux si j'appelais Thread.start() au lieu de .run()
Marsh Posté le 07-09-2004 à 19:04:12
ReplyMarsh Posté le 07-09-2004 à 19:09:15
Code :
|
on peut meme se manger des NullPointerException
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 )
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? |
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 ...
Marsh Posté le 07-09-2004 à 19:39:53
the real moins moins a écrit : probleme reproduit. |
tu les croyais pas quand il te le disais dans la javadoc ?
Marsh Posté le 07-09-2004 à 19:59:25
benou a écrit : |
bien sur que si mais je voulais voir le genre de problème que ça causait, concretement. (voir premier post du topic )
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 ... |
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
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 ...
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
Marsh Posté le 07-09-2004 à 21:19:47
bien sur, je voulais dire le détecter à un autre endroit ...
Marsh Posté le 07-09-2004 à 21:21:51
ReplyMarsh Posté le 07-09-2004 à 21:27:36
the real moins moins a écrit : detecter koi ? |
le probleme de config je pense
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
Marsh Posté le 07-09-2004 à 23:41:14
bin merde alors
Marsh Posté le 07-09-2004 à 23:43:27
ReplyMarsh 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
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 |
non masi tu peux detecter si elle convient pas. Apres c'est sur que t'es pas plus avance
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 ...
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();
Marsh Posté le 09-09-2004 à 08:28:38
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 ...
Marsh Posté le 09-09-2004 à 10:42:36
benou a écrit : |
haaaaan
oui c'est interessant, mais dans un contexte j2ee je suis pas sur que ça soit la chose la plus propre à faire
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
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 ...
Marsh Posté le 07-09-2004 à 12:41:15
Salut,
Sur http://java.sun.com/j2se/1.4.2/doc [...] ormat.html je lis:
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 ?