您的位置:首页 > 其它

SimpleDateFormat 转为线程安全

2015-06-29 11:04 363 查看
多线程调用是会报错。

解决方案:

/**

  * 将字符串转换为日期(与时间)

  */

 public static Date parseDatetime(String datetime) throws BusinessException {

  try {

   if (datetime.indexOf(' ') > 0) {

       return getSdf("yyyy-MM-dd HH:mm:ss").parse(datetime);

   } else {

    return getSdf("yyyy-MM-dd").parse(datetime);

   }

  } catch (Exception e) {

      e.printStackTrace();

   throw new BusinessException(ResultMsg.BEAN_COPY_EXCEPTION, "日期字符串格式错误:" + datetime);

  }

 }

/**

     * 返回一个ThreadLocal的sdf,每个线程只会new一次sdf

     */

    public static SimpleDateFormat getSdf(final String pattern) {

        ThreadLocal<SimpleDateFormat> tl = sdfMap.get(pattern);

        if (tl == null) {

            synchronized (lockObj) {

                tl = sdfMap.get(pattern);

                if (tl == null) {

                    tl = new ThreadLocal<SimpleDateFormat>() {

                     @Override

                        protected SimpleDateFormat initialValue() {

                            return new SimpleDateFormat(pattern);

                        }

                    };

                    sdfMap.put(pattern, tl);

                }

            }

        }

        return tl.get();

    }

 /** 锁对象 */

    private static final Object lockObj = new Object();

    /** 存放不同的日期模板格式的sdf的Map */

    private static Map<String, ThreadLocal<SimpleDateFormat>> sdfMap = new HashMap<String, ThreadLocal<SimpleDateFormat>>();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  线程安全 多线程