Синхронизация доступа к SimpleDateFormat

В javadoc для SimpleDateFormat указано, что SimpleDateFormat не синхронизируется.

« Форматы даты не синхронизируются. Это рекомендуется создавать отдельные экземпляры формата для каждого потока. Если несколько потоков обращаются к формату одновременно он должен быть синхронизирован внешне. "

Но каков наилучший подход к использованию экземпляра SimpleDateFormat в многопоточной среде. Вот несколько вариантов, о которых я подумал, я использовал варианты 1 и 2 в прошлом, но мне любопытно узнать есть ли какие-либо лучшие альтернативы или какой из этих вариантов обеспечивает лучшую производительность и параллелизм.

Вариант 1: Создавать локальные экземпляры, когда требуется

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

Вариант 2: Создать экземпляр SimpleDateFormat как переменную класса, но синхронизировать доступ к нему .

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

Вариант 3: Создайте ThreadLocal для хранения разных экземпляров SimpleDateFormat для каждого потока.

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);
}
86
задан Raedwald 13 June 2013 в 12:15
поделиться