2012-05-02 21 views
8
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 

La riga sopra è menzionata nella classe JavaDoc della classe SimpleDateFormat.java.text.SimpleDateFormat non thread safe

Significa che non dobbiamo creare gli oggetti SimpleDateFormat come statici.

E se lo creiamo come statico, quindi ovunque utilizziamo questo oggetto, dobbiamo tenerlo in Synchronized Block.

+2

sì, sei corretto –

+2

Il nuovo 'java.time.format.DateTimeFormatter' (da Java 1.8)" è immutabile e sicuro per i thread ". Dai un'occhiata a: https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html – Linuslabo

risposta

14

Sì SimpleDateFormat non è thread-safe ed è consigliato anche quando si sta analizzando la data dovrebbe accedere in modo sincronizzato.

public Date convertStringToDate(String dateString) throws ParseException { 
    Date result; 
    synchronized(df) { 
     result = df.parse(dateString); 
    } 
    return result; 
} 

un altro modo è http://code.google.com/p/safe-simple-date-format/downloads/list

21

È vero. Puoi trovare già domande su questo problema su StackOverflow. Io uso di dichiararla come ThreadLocal:

private static final ThreadLocal<DateFormat> THREAD_LOCAL_DATEFORMAT = new ThreadLocal<DateFormat>() { 
    protected DateFormat initialValue() { 
     return new SimpleDateFormat("yyyyMMdd"); 
    } 
}; 

e nel codice:

DateFormat df = THREAD_LOCAL_DATEFORMAT.get(); 
9

Quello è corretto. FastDateFormat da Apache Commons Lang è una buona alternativa a prova di thread.

Dalla versione 3.2 supporta anche l'analisi, prima della sola formattazione 3.2.