`
newslxw
  • 浏览: 207788 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

SimpleDateFormat在多线程下不安全

阅读更多
在工具类中有2个时间格式化和字符串转换成时间的函数,使用了类静态变量
SimpleDateFormat,具体代码如下:
public class Utils
{
	public static SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");


public static String getLocalTime(Date d)
	{
		Date tmp = d;
		if (tmp == null)
			tmp = new Date();
		String ret = null;
			ret = df.format(tmp);
		return ret;
	}

	
	public static Date parse2Time(String date)
	{
		Date d = null;
		try
		{
			if (date.length() == 8)
				date = date + "000000";
				d = df.parse(date);

		}
		catch (ParseException e)
		{
			LogUtils.Log(logger, e);
		}
		return d;
	}

}

在多线程下使用时,报如下错误:
Exception in thread "Thread-11" java.lang.NumberFormatException: multiple points
	at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1084)
	at java.lang.Double.parseDouble(Double.java:510)
	at java.text.DigitList.getDouble(DigitList.java:151)
	at java.text.DecimalFormat.parse(DecimalFormat.java:1303)
	at java.text.SimpleDateFormat.subParse(SimpleDateFormat.java:1936)
	at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1312)
	at java.text.DateFormat.parse(DateFormat.java:335)


后来将代码改成如下就好了:
public class Utils
{
	public static String getLocalTime(Date d)
	{
		Date tmp = d;
		if (tmp == null)
			tmp = new Date();
		String ret = null;
		synchronized(df)
		{
			ret = df.format(tmp);
		}
		return ret;
	}

	
	public static Date parse2Time(String date)
	{
		Date d = null;
		try
		{
			if (date.length() == 8)
				date = date + "000000";
			synchronized(df)
			{
				d = df.parse(date);
			}
		}
		catch (ParseException e)
		{
			LogUtils.Log(logger, e);
		}
		return d;
	}

}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics