记录线上时间转化出错偶现问题

    这两天出现别人调用项目接口,大量的不断请求下数据返回也比较大,我们在接口中对时间进行的转化,出现的情况是偶尔会有极个别时间不对,比如应该是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类这种线程安全类,同时我们把时间转化对象放在方法内,每个请求都会创建一个时间转化对象,被线程所独享,修改后一切恢复正常不会出现时间问题。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容