Board logo

标题: 一次 SimpleDateFormat 引发的惨案(4) [打印本页]

作者: look_w    时间: 2019-4-12 15:42     标题: 一次 SimpleDateFormat 引发的惨案(4)

解决方案

方法一:

    public class DataTool {
     
        private static Logger logger = Logger.getLogger(DataTool.class);
     
        public static String CCTToUTC(String timeString) {
            try {
                Date date = getDateSdf().parse(timeString);
                Calendar calendar = Calendar.getInstance();
                Date tgtDate = new Date(date.getTime() - calendar.getTimeZone().getRawOffset());
                return getTimeZoneSdf().format(tgtDate);
            } catch (Exception e) {
                logger.warn(timeString + " parse err", e);
                return getTimeZoneSdf().format(new Date());
            }
        }
     
        private static SimpleDateFormat getTimeZoneSdf() {
            return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
        }
     
        private static SimpleDateFormat getDateSdf() {
            return new SimpleDateFormat("yyyy-MM-dd");
        }
    }
    复制代码

在需要用到 SimpleDateFormat 的地方就新建一个实例。不管什么时候,将有线程安全问题的对象由共享变为局部私有都能避免多线程问题,不过也加重了创建对象的负担。在一般情况下,这样其实对性能影响也不是那么明显。

方法二:

    public class DateUtil {
        private static Logger logger = Logger.getLogger(DataTool.class);
        private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        private static SimpleDateFormat timeZoneSdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
     
        public static String CCTToUTC(String timeString) {
            try {
                Date date = parse(timeString);
                Calendar calendar = Calendar.getInstance();
                Date tgtDate = new Date(date.getTime() - calendar.getTimeZone().getRawOffset());
                return formatDate(tgtDate);
            } catch (Exception e) {
                logger.warn(timeString + " parse err", e);
                return formatDate(new Date());
            }
        }
     
        private static Date parse(String strDate) throws ParseException {
            synchronized(sdf){
                return sdf.parse(strDate);
            }
        }
     
        private static String formatDate(Date date) throws ParseException {
            synchronized(timeZoneSdf){
                return sdf.format(date);
            }  
        }
    }
    复制代码

当线程较多时,当一个线程调用该方法时,其他想要调用此方法的线程就要 block,多线程并发量大的时候会对性能有一定的影响。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0