您的位置:首页 > 其它

SimpleDateFormat 引起的线程安全隐患问题

2014-05-13 14:31 405 查看
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共享问题就不存在了,当然也就解决了线程安全问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: