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);
}
+1提出這個問題。許多人認爲SimpleDateFormat是線程安全的(我在各處都能看到假設)。 – 2011-03-03 18:50:39
有關ThreadLocal方法的詳細信息,請參閱: http://www.javaspecialists.eu/archive/Issue172.html – miner49r 2012-02-04 14:02:11
爲什麼請參閱此問題:http://stackoverflow.com/questions/6840803/simpledateformat-線程安全 – Raedwald 2013-06-13 12:17:46