这两天出现别人调用项目接口,大量的不断请求下数据返回也比较大,我们在接口中对时间进行的转化,出现的情况是偶尔会有极个别时间不对,比如应该是12:00:00的时间数据,但是接口返回是12:00:10,但是再次用同样的入参请求时间又正常了,这种情况经过排查是在高并发情况下,频繁的进行时间转化可能会出现时间转化错误,具体解决代码如下
public class DateUtils {
// private static SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
//
// public static String ToString(long time) {
// try {
// Date date = new Date(time);
// return format.format(date);
// } catch (Exception e) {
// e.printStackTrace();
// }
// return null;
// }
public static StringToString(long time){
try{
String pattern="yyyy/MM/dd HH:mm:ss";
LocalDateTime dateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(time),ZoneId.systemDefault());
return dateTime.format(DateTimeFormatter.ofPattern(pattern));
}catch (Exception e){
e.printStackTrace();
}
return null;
}
}
问题在于两方面:首先我们这边代码中用的SimpleDateFormat 类本身就是线程不安全的类,在多线程情况下会出现时间转化错误,其次SimpleDateFormat的对象我们用static作为全局变量,这个变量被所有线程所共有也是不安全的。
因此我们这里的措施是使用DateTimeFormatter类这种线程安全类,同时我们把时间转化对象放在方法内,每个请求都会创建一个时间转化对象,被线程所独享,修改后一切恢复正常不会出现时间问题。