使用static SimpleDateFormat引发的同步问题
测试一个接口,发送的报文仅id不同,其他的值都是相同的,但是接口返回的是“日期格式错误”。经核实,接口中校验日期格式的方法用的是SimpleDateFormat的parse()方法。
查看jdk api:
日期格式是不同步的。建议为每个线程创建独立的格式实例。如果多个线程同时访问一个格式,则它必须是外部同步的。
下面为事件还原代码:<!--more-->
package com.test;
import java.text.SimpleDateFormat;
/**
* @author: 乌鸦
* Date: 2016/5/26 16:32
* Description:
*/
public class DateFormatTest extends Thread {
private String name;
public DateFormatTest(String name) {
this.name = name;
}
public void run() {
String dateStr = "20160526163700";
boolean result = DateFormatTest.checkDate(dateStr,DateFormatTest.SDF14);
System.out.println(name + " : " + result);
}
public static void main(String[] args) throws InterruptedException {
/*多线程可能报错*/
for(int i=0; i<100; i++){
new DateFormatTest("B"+i).start();
}
/*单线程不会报错*/
/* for(int i=0; i<100; i++){
String dateStr = "20160526163700";
boolean result = DateFormatTest.checkDate(dateStr,DateFormatTest.SDF14);
System.out.println(i + " : " + result);
}*/
}
/* 以下是接口中校验日期的方法 */
private static final String DATE_FORMAT14 = "yyyyMMddHHmmss";
public static final SimpleDateFormat SDF14 = new SimpleDateFormat(DATE_FORMAT14);
public static boolean checkDate(String date, SimpleDateFormat format) {
try {
format.parse(date);
} catch (Exception ex) {
ex.printStackTrace();
return false;
}
return true;
}
}
在java中,多线程是很重要的一块,看来多线程处处是坑啊。
参考:
http://www.cnblogs.com/zemliu/archive/2013/08/29/3290585.html