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共享问题就不存在了,当然也就解决了线程安全问题。