首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

一次 SimpleDateFormat 引发的惨案(4)

一次 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,多线程并发量大的时候会对性能有一定的影响。
返回列表