La synchronisation de l'accès à SimpleDateFormat

La javadoc de SimpleDateFormat états qui SimpleDateFormat n'est pas synchronisé.

"Formats de Date ne sont pas synchronisés. Il
est recommandé de créer des
format instances pour chaque thread. Si
plusieurs threads accèdent à un format
en même temps, elle doit être synchronisée
en externe."

Mais quelle est la meilleure approche à l'aide d'une instance de SimpleDateFormat dans un environnement multithread. Voici quelques options que j'ai pensé, j'ai utilisé les options 1 et 2 dans le passé, mais je suis curieux de savoir si il ya des meilleures alternatives ou laquelle de ces options serait d'offrir le meilleur de la performance et de la concurrence.

Option 1: Créer des instances locales lorsque requis

public String formatDate(Date d) {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    return sdf.format(d);
}

Option 2: Créer une instance de SimpleDateFormat comme une variable de classe, mais de synchroniser l'accès à elle.

private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
public String formatDate(Date d) {
    synchronized(sdf) {
        return sdf.format(d);
    }
}

Option 3: Créer un ThreadLocal pour stocker une instance différente de SimpleDateFormat pour chaque thread.

private ThreadLocal<SimpleDateFormat> tl = new ThreadLocal<SimpleDateFormat>();
public String formatDate(Date d) {
    SimpleDateFormat sdf = tl.get();
    if(sdf == null) {
        sdf = new SimpleDateFormat("yyyy-MM-hh");
        tl.set(sdf);
    }
    return sdf.format(d);
}
InformationsquelleAutor 3urdoch | 2010-11-05