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















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值