前言:

SimpleDateFormat不是线程安全的,而且创建一个实例的开销是非常昂贵,解析字符串时间时频繁创建生命周期短暂的实例导致性能低下。

SimpleDateFormat的javadoc中有这么句话:

Synchronization

Date formats are not synchronized. It is recommended to create separate format instances for each thread. If multiple threads access a format concurrently, it must be synchronized externally.

翻译一下:

*日期格式是不同步的.

* 建议为每个线程创建独立的格式实例.

* 如果多线程并发访问同一个格式,则必须保持外部同步.

目前很多公司使用的是一下两种方式去创建的日期工具类:

1、在每个方法里面使用new SimpleDateFormat的形式

public static Date newParse(String strDate) throws ParseException {return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(strDate);
}

注:这种方式是能解决线程安全问题,但是产生了性能问题,主要是创建一个 SimpleDateFormat实例的开销比较昂贵,解析字符串时间时频繁创建生命周期短暂的实例导致性能低下。

2、定义一个全局变量

private static final SimpleDateFormat datetimeFormat =
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");/*** 格式化日期与时间*/public static String formatDatetime(long timestamp) {return datetimeFormat.format(new Date(timestamp));}

注:这种方式是解决了性能问题,但是没有解决线程安全问题,在多线程环境下,容易发生各种意想不到的问题,如:java.lang.NumberFormatException: multiple points或者java.lang.NumberFormatException: For input string: ""等异常。

解决此问题有两种方式:

1、使用Threadlocal

    private static final ThreadLocal<SimpleDateFormat>  _threadLocal    = new ThreadLocal<SimpleDateFormat>() {protected SimpleDateFormat initialValue() {return new SimpleDateFormat();}};/*** 格式化日期与时间*/public static String formatDatetime(long timestamp) {return _threadLocal.get().format(new Date(timestamp));}

2、使用享元模式

A、创建SimpleDateFormatFactory类

public class SimpleDateFormatFactory {private static final ThreadLocal<Map<String, SimpleDateFormat>>    _threadLocal    = new ThreadLocal<Map<String, SimpleDateFormat>>() {protected Map<String, SimpleDateFormat> initialValue() {return new HashMap<String, SimpleDateFormat>();}};public static SimpleDateFormat getInstance() {return getInstance(DateUtil.DATE_FORMAT);}public static SimpleDateFormat getInstance(String format) {SimpleDateFormat sdf = _threadLocal.get().get(format);if (null == sdf) {sdf = new SimpleDateFormat(format);_threadLocal.get().put(format, sdf);}return sdf;}
}

B、DateUtil类

public class DateUtil {/*** 显示日期的格式,yyyy-MM-dd*/public static final String DATE_FORMAT = "yyyy-MM-dd";/*** DateFormat,格式:yyyy-MM-dd*/private static DateFormat dateFormat;static {dateFormat = SimpleDateFormatFactory.getInstance(DATE_FORMAT);}/*** 格式化日期与时间*/public static String formatDatetime(long timestamp) {return dateFormat.format(new Date(timestamp));}}

优点:可以更好的去减少系统中对象的个数和对外部状态相对独立等好处。

解决SimpleDateFormat线程不安全问题相关推荐

  1. hashmap是线程安全的吗?怎么解决?_解决SimpleDateFormat线程安全问题

    SimpleDateFormat是线程不安全的类,一般不要定义为static变量,如果定义为static,必须通过加锁等方式保证线程安全. 例如下面一段代码,启动10个线程,同时使用一个`Simple ...

  2. SimpleDateFormat类的安全问题,这6个方案总有一个适合你

    本文分享自华为云社区<[高并发]SimpleDateFormat类的线程安全问题和解决方案(附6种解决方案)>,作者: 冰 河. 首先问下大家:你使用的SimpleDateFormat类还 ...

  3. SimpleDateFormat的线程不安全问题

    一.前言 日期的转换与格式化在项目中应该是比较常用的了,最近同事小刚出去面试实在是没想到被 SimpleDateFormat 给摆了一道- 面试官:项目中的日期转换怎么用的?SimpleDateFor ...

  4. 关于如何解决java线程安全问题?很重要? 快拿小本本记下来!

    关于如何解决java线程安全问题?很重要? 快拿小本本记下来! 线程安全问题 什么是线程安全问题? 线程同步 同步代码块 同步方法 lock显示锁 线程安全问题 什么是线程安全问题? 多个线程操作同一 ...

  5. SimpleDateFormat线程不安全了?这里有5种解决方案

    摘要:我们知道SimpleDateFormat是线程不安全,本文会介绍多种解决方案来保证线程安全. 本文分享自华为云社区<java的SimpleDateFormat线程不安全出问题了,虚竹教你多 ...

  6. 为什么SimpleDateFormat线程不安全? 侵立删

    转自:https://mp.weixin.qq.com/s/2uzr800WYtu4R0hycfGruA 在日常开发中,我们经常会用到时间相关类,我们有很多办法在Java代码中获取时间.但是不同的方法 ...

  7. java多线程的安全_java-多线程的安全问题

    在实际应用中,我们通常会遇到多线程安全问题, 涉及到两个因素: 1,多个线程在操作共享数据. 2,有多条语句对共享数据进行运算. 原因:这多条语句,在某一个时刻被一个线程执行时,还没有执行完,就被其他 ...

  8. hashmap是线程安全的吗?怎么解决?_线程安全及三种解决方案

    线程安全:如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的. 线程安全问题都是由全局变量及静 ...

  9. Day25(线程同步安全问题,SellticketLock,DieLock,ThredGroup,ThreadPool,Timer,线程安全的类,匿名内部类的形式创建线程对象)

    一.线程同步安全问题1 package com.shujia.lhw.day25.demo1; /*     分析:       共享数据:同一个学生对象Student       生产者:SetTh ...

最新文章

  1. 5/29 c的结构体变量
  2. Http协议中Get和Post的浅谈
  3. Socket网络编程笔记
  4. 【必看】新手妹子一键删库,老司机机智救场
  5. 分享:RethinkDB 1.3 发布,分布式 JSON 数据库
  6. html5清除手机页面缓存文件夹,WebView自动缓存-清除缓存
  7. 《C++ Primer》7.2节练习
  8. 希尔伯特向量空间中的信号
  9. 直播带货,碾压无数上市公司
  10. Suse发生了错误Access denied for user #39;#39;@#39;localhost#39; toamp;
  11. SQL中,like的SQL注入防止,使用预编译SQL(?)的写法
  12. nginx 配置反向代理
  13. android studio增量包,Android Studio 更新升级之增量升级
  14. chronyd同步windows时钟源问题
  15. C语言入门-跑步问题
  16. 爬虫 微博评论记录_记录或评论?
  17. ROOT大师PC版 v1.7.6.7190 绿色免费版
  18. 机器学习(回归八)——Softmax回归
  19. Redis数据类型——list
  20. 莆田鞋,是炒鞋经济的噩梦吗?

热门文章

  1. 网络通信、UDP通信、TCP通信、BS架构模拟、URL了解
  2. Access用户如何借助低代码转型为Web(B/S和移动端)开发?
  3. sql 注入_商洛学院司徒荆_新浪博客
  4. Invalid Login Credentials
  5. 龙芯3a5000相当于英特尔什么水平
  6. wp教程-wp详细教程-免费wordpress模板主题搭建教程
  7. 垂直起降多旋翼调研资料
  8. 运算放大器应用汇总2
  9. 华硕主板橙色灯亮无法开机
  10. PhotoShop如何导出线性空间下的图片