SimpleDateFormat為非線程(Thread)安全, 多線程時會造成問題庶柿。
方法一:
直接用static
缺點:不同線程的安全性(皆能共享)
方法二:
使用時才new一個
缺點:消耗內(nèi)存, 影響效能
方法三:
最推薦的方式為透過ThreadLocal
ThreadLocal可根據(jù)不同線程, 存取不同的值,
舉個例子:
final int num = 10;
final ThreadLocal<Integer> threadLocal = new ThreadLocal<>();
threadLocal.set(num);
Log.e("adam", "test, 1, get: " + threadLocal.get());
new Thread(new Runnable() {
@Override
public void run() {
threadLocal.set(20);
Log.e("adam", "test, 2, get: " + threadLocal.get());
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
Log.e("adam", "test, 3, get: " + threadLocal.get());
runOnUiThread(new Runnable() {
@Override
public void run() {
Log.e("adam", "test, 4, get: " + threadLocal.get());
}
});
}
}).start();
結(jié)果:
test, 1, get: 10
test, 2, get: 20
test, 3, get: null
test, 4, get: 10
Thread中沒設(shè)值時, 取出的是null, UIThreadhread設(shè)的是10, 並沒有因為第一個Thread設(shè)值20而改變, test 4依然是10轧坎。
由此可確認,ThreadLocal的存取是獨立於不同線程原献。
SimpleDateFormat透過ThreadLocal:
private static final ThreadLocal<DateFormat> dateFormatThreadLocal = new ThreadLocal<DateFormat>();
private static DateFormat getDateFormat(String format){
DateFormat dateFormat = dateFormatThreadLocal.get();
if(dateFormat == null){
dateFormat = new SimpleDateFormat(format);
dateFormatThreadLocal.set(dateFormat);
}
return dateFormat;
}