解决SimpleDateFormat线程不安全问题
前言:
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线程不安全问题相关推荐
- hashmap是线程安全的吗?怎么解决?_解决SimpleDateFormat线程安全问题
SimpleDateFormat是线程不安全的类,一般不要定义为static变量,如果定义为static,必须通过加锁等方式保证线程安全. 例如下面一段代码,启动10个线程,同时使用一个`Simple ...
- SimpleDateFormat类的安全问题,这6个方案总有一个适合你
本文分享自华为云社区<[高并发]SimpleDateFormat类的线程安全问题和解决方案(附6种解决方案)>,作者: 冰 河. 首先问下大家:你使用的SimpleDateFormat类还 ...
- SimpleDateFormat的线程不安全问题
一.前言 日期的转换与格式化在项目中应该是比较常用的了,最近同事小刚出去面试实在是没想到被 SimpleDateFormat 给摆了一道- 面试官:项目中的日期转换怎么用的?SimpleDateFor ...
- 关于如何解决java线程安全问题?很重要? 快拿小本本记下来!
关于如何解决java线程安全问题?很重要? 快拿小本本记下来! 线程安全问题 什么是线程安全问题? 线程同步 同步代码块 同步方法 lock显示锁 线程安全问题 什么是线程安全问题? 多个线程操作同一 ...
- SimpleDateFormat线程不安全了?这里有5种解决方案
摘要:我们知道SimpleDateFormat是线程不安全,本文会介绍多种解决方案来保证线程安全. 本文分享自华为云社区<java的SimpleDateFormat线程不安全出问题了,虚竹教你多 ...
- 为什么SimpleDateFormat线程不安全? 侵立删
转自:https://mp.weixin.qq.com/s/2uzr800WYtu4R0hycfGruA 在日常开发中,我们经常会用到时间相关类,我们有很多办法在Java代码中获取时间.但是不同的方法 ...
- java多线程的安全_java-多线程的安全问题
在实际应用中,我们通常会遇到多线程安全问题, 涉及到两个因素: 1,多个线程在操作共享数据. 2,有多条语句对共享数据进行运算. 原因:这多条语句,在某一个时刻被一个线程执行时,还没有执行完,就被其他 ...
- hashmap是线程安全的吗?怎么解决?_线程安全及三种解决方案
线程安全:如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的. 线程安全问题都是由全局变量及静 ...
- Day25(线程同步安全问题,SellticketLock,DieLock,ThredGroup,ThreadPool,Timer,线程安全的类,匿名内部类的形式创建线程对象)
一.线程同步安全问题1 package com.shujia.lhw.day25.demo1; /* 分析: 共享数据:同一个学生对象Student 生产者:SetTh ...
最新文章
- 5/29 c的结构体变量
- Http协议中Get和Post的浅谈
- Socket网络编程笔记
- 【必看】新手妹子一键删库,老司机机智救场
- 分享:RethinkDB 1.3 发布,分布式 JSON 数据库
- html5清除手机页面缓存文件夹,WebView自动缓存-清除缓存
- 《C++ Primer》7.2节练习
- 希尔伯特向量空间中的信号
- 直播带货,碾压无数上市公司
- Suse发生了错误Access denied for user #39;#39;@#39;localhost#39; toamp;
- SQL中,like的SQL注入防止,使用预编译SQL(?)的写法
- nginx 配置反向代理
- android studio增量包,Android Studio 更新升级之增量升级
- chronyd同步windows时钟源问题
- C语言入门-跑步问题
- 爬虫 微博评论记录_记录或评论?
- ROOT大师PC版 v1.7.6.7190 绿色免费版
- 机器学习(回归八)——Softmax回归
- Redis数据类型——list
- 莆田鞋,是炒鞋经济的噩梦吗?