import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
public class LocalThreadTest extends Thread{
private final static DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
private String time = "2013-12-12";
LocalThreadTest(String time){
this.time = time;
}
LocalThreadTest(){
}
public Date Convert(String time) throws Exception{
return format.parse(time);
}
public void run() {
try {
Date date = Convert(time);
System.out.println(Thread.currentThread().getName()+" "+date);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
LocalThreadTest test = new LocalThreadTest();
LocalThreadTest test1 = new LocalThreadTest("2010-12-12");
test.start();
test1.start();
}
}
public Date parse(String text, ParsePosition pos)
{
checkNegativeNumberExpression();
int start = pos.index;
int oldStart = start;
int textLength = text.length();//斷點
calendar.clear(); // Clears all the time fields
.......//對calendar的一些操作
calendar.getTime();//返回calendar中存儲的時間,此處有斷點
}
第一個線程 執行到 calendar.getTime();
第二個線程 執行完成,再繼續執行完第一個線程,
結果會是:
Thread-1 Fri Nov 12 00:00:00 CST 2010
Thread-0 Tue Nov 30 00:00:00 CST 2010
或者
Thread-0 Thu Dec 12 00:00:00 CST 2013
Thread-0 Thu Dec 12 00:00:00 CST 2013
線程問題原因,
線程一的結果還未輸出,calendar中的時間就被clear,然後第二個線程將 其時間放入calendar,所以第一個線程最終得到的時間就 會和 第二個線程的時間一樣。出現線程安全問題。
解決方案:
1>同步代碼塊
在使用到 SimpleDateFormat 的代碼中使用 synchronized 關鍵字
2>使用 ThreadLocal ,目的是使每個線程都有一份自己的 SimpleDateFormat ,這樣上面所說的calendar共享問題就不存在了,當然也就解決了線程安全問題。