SimpleDateFormat 引起的線程安全隱患問題

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共享問題就不存在了,當然也就解決了線程安全問題。















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章