zoukankan      html  css  js  c++  java
  • SimpleDateFormat非线程安全

    SimpleDateFormat非线程安全主要原因是parse()方法使用calendar来生成返回的Date实例,而每次parse之前,都会把calendar里的相关属性清除掉。

    问题是这个calendar是个全局变量,也就是线程共享的。因此就会出现一个线程刚把calendar设置好,另一个线程就把它给清空了,这时第一个线程再parse的话就会有问题了。

    解决方案:1. 每次使用时创建一个新的SimpleDateFormat实例;

           2. 创建一个共享的SimpleDateFormat实例变量,并对这个变量进行同步;

          

       private static synchronized SimpleDateFormat simpleDateFormat = new SimpleDateFormat();

                 3. 使用ThreadLocal为每个线程都创建一个独享的SimpleDateFormat实例变量。

       private static final ThreadLocal<SimpleDateFormat> simpleDateFormat = new ThreadLocal<SimpleDateFormat>();
        private static ThreadLocal<SimpleDateFormat> simpleDateFormat1 = new ThreadLocal<SimpleDateFormat>();
        
        public static String getTodayStr(long cur) {
            SimpleDateFormat format = simpleDateFormat1.get();
            if (null == format) {
                format = new SimpleDateFormat("yyyy-MM-dd");
                simpleDateFormat1.set(format);
            }
            return format.format(new Date(cur));
        }
        
        public static long parseDate(String str) {
            SimpleDateFormat format = simpleDateFormat.get();
            if (null == format) {
                format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                simpleDateFormat.set(format);
            }
            try {
                str = str.replace(":", ":");
                return format.parse(str).getTime();
            } catch (Exception e) {
                throw new RuntimeException("时间格式错误:" + str, e);
            }
        }
  • 相关阅读:
    01_Struts2概述及环境搭建
    CSRF跨站请求伪造
    XSS跨站脚本攻击
    文件包含漏洞
    文件上传漏洞
    PHP常见代码执行后门函数
    SQL注入总结
    [转]Android PopupWindow的使用和分析
    [转] 基于XMPP协议的Android即时通信系
    [转]Android推送方案分析(MQTT/XMPP/GCM)
  • 原文地址:https://www.cnblogs.com/cherish010/p/8671561.html
Copyright © 2011-2022 走看看