SimpleDateformat 线程不安全

SimpleDateFormat 继承自 DateFormat, SimpleDateFormat中的parse方法override父类DateFormat的parse方法。DateFormat的父类提供了public setCalendar的方法 导致潜在的线程安全问题。

  • parse方法不安全,使用了实例变量calendar.  当SimpleDateFormat设置为静态变量,多线程calendar发生变化,造成parse中的calendar变量发生了修改。

  • format方法不安全,同样是calendar引起的。

解决方案一 jdk7 ThreadLocal

public class MyDateUtil {

    private static final ThreadLocal<DateFormat> threadSafeFormat = new ThreadLocal<DateFormat>();
private static final String MESSAGE_FORMAT = "MM-dd HH:mm:ss.ms"; public static final DateFormat getDateFormat() {
// 并发环境下,获取到的是本线程内自己的format
DateFormat format = threadSafeFormat.get();
if (format == null) {
format = new SimpleDateFormat(MESSAGE_FORMAT);
// 并发环境下,将format设置到自己的线程内
threadSafeFormat.set(format);
} return format;
}
}

解决方案二 jdk7 每次new一个新对象

public static final Date getDate(String formatter, String date) {
DateTimeFormatter formatter = new DateTimeFormatter(formatter);
return formatter.format(date);
}

解决方案二 jdk8  DateTimeFormatter 线程安全

DateTimeFormatter内部的static methods 都是返回 new对象或者

    public static Date convertStr2Date(String strDate, String dateFormatter, ZoneIdEnum timezone) {
DateTimeFormatter ofPattern = DateTimeFormatter.ofPattern(dateFormatter);
LocalDate parseDate = LocalDate.parse(strDate,ofPattern);
ZoneId zone = ZoneId.of(timezone.getZoneId());
Instant instant = parseDate.atStartOfDay().atZone(zone).toInstant();
return Date.from(instant);
}
public enum ZoneIdEnum {
AUSTRALIA_DARWIN("Australia/Darwin"),
AUSTRALIA_SYDNEY("Australia/Sydney"),
AMERICA_ARGENTINA_BUENOS_AIRES("America/Argentina/Buenos_Aires"),
AFRICA_CAIRO("Africa/Cairo"),
AMERICA_ANCHORAGE("America/Anchorage"),
AMERICA_SAO_PAULO("America/Sao_Paulo"),
ASIA_DHAKA("Asia/Dhaka"),
AFRICA_HARARE("Africa/Harare"),
AMERICA_ST_JOHNS("America/St_Johns"),
AMERICA_CHICAGO("America/Chicago"),
/**
* UTC+8
*/
ASIA_SHANGHAI("Asia/Shanghai"),
AFRICA_ADDIS_ABABA("Africa/Addis_Ababa"),
EUROPE_PARIS("Europe/Paris"),
AMERICA_INDIANA_INDIANAPOLIS("America/Indiana/Indianapolis"),
ASIA_KOLKATA("Asia/Kolkata"),
ASIA_TOKYO("Asia/Tokyo"),
PACIFIC_APIA("Pacific/Apia"),
ASIA_YEREVAN("Asia/Yerevan"),
PACIFIC_AUCKLAND("Pacific/Auckland"),
ASIA_KARACHI("Asia/Karachi"),
AMERICA_PHOENIX("America/Phoenix"),
AMERICA_PUERTO_RICO("America/Puerto_Rico"),
AMERICA_LOS_ANGELES("America/Los_Angeles"),
PACIFIC_GUADALCANAL("Pacific/Guadalcanal"),
ASIA_HO_CHI_MINH("Asia/Ho_Chi_Minh"); private final String zoneId; private ZoneIdEnum(String zoneId) {
this.zoneId = zoneId ;
} public String getZoneId() {
return zoneId;
}
}

DateFormat 线程安全的更多相关文章

  1. java.text.DateFormat 线程不安全问题

    java.text下的 DateFormat 是线程不安全的: 建议1: 1.使用threadLocal包装DateFormat(太复杂,不推荐) 2.使用org.apache.commons.lan ...

  2. java8-新的日期API

    背景 java的日期和时间API设计不理想,java8引入新的时间和日期API就是为了解决这个问题. 老的日期API的核心类 缺点 Date 月从0开始,年最小从1900年开始,没有时区的概念 Cal ...

  3. Java日期时间API系列1-----Jdk7及以前的日期时间类

    先看一个简单的图: 主要的类有: Date类负责时间的表示,在计算机中,时间的表示是一个较大的概念,现有的系统基本都是利用从1970.1.1 00:00:00 到当前时间的毫秒数进行计时,这个时间称为 ...

  4. 《Java 8 in Action》Chapter 12:新的日期和时间API

    在Java 1.0中,对日期和时间的支持只能依赖java.util.Date类.同时这个类还有两个很大的缺点:年份的起始选择是1900年,月份的起始从0开始. 在Java 1.1中,Date类中的很多 ...

  5. DateFormat 竟然是非线程安全的?!!!!!

    今天撸代码忽然发现一个奇怪的一场抛出,经过一番排查发现有可能DateFormat 的多线程问题造成的,网上一查DateFormat竟然非线程安全.那我原先的代码...(细思极恐)

  6. 第三章 线程安全的DateFormat工具类

    1.使用threadLocal包装DateFormat(太复杂,不推荐) 2.使用org.apache.commons.lang3.time.DateFormatUtils下的方法(推荐) DateF ...

  7. DateFormat的format()方法线程不安全的问题分析

    最近看到<侦探剧场:堆内存神秘溢出事件>https://my.oschina.net/u/2368090/blog/1628720,于是自己也想测试了解一下DateFormat的多线程安全 ...

  8. java 多线程:线程安全问题,示例DateFormat多线程执行冲突解决方案ThreadLocal、方法内变量

    SimpleDateFormat多线程中执行报错 java.lang.NumberFormatException: For input string: ""   import ja ...

  9. Spring单例模式与线程安全

    问题背景 这段时间在做项目的时候,考虑到Spring中的bean默认是单例模式的,那么当多个线程调用同一个bean的时候就会存在线程安全问题.如果是Spring中bean的创建模式为非单例的,也就不存 ...

随机推荐

  1. webpack4.0.1安装问题及解决方法

    2月底的时候,webpack4正式发布了,但是当我们安装之后,使用下面的语句来打包的时候,发现打包失败了 webpack ./src/main.js ./dist/bundle.js 并且给出了下面这 ...

  2. [USACO14JAN]Recording the Moolympics

    题目描述 Being a fan of all cold-weather sports (especially those involving cows), Farmer John wants to ...

  3. CF864 E DP 输出路径

    n个物品有Deadline,拿物品需要花费时间,问取得最大价值的方案. 本质是个01背包,先按时间排序,然后把花费的时间作为背包就行了. 主要就是找方案,倒过来找发生转移的就行了. 太菜了真的不会打C ...

  4. HDU 2588 思维 容斥

    求满足$1<=X<=N ,(X,N)>=M$的个数,其中$N, M (2<=N<=1000000000, 1<=M<=N)$. 首先,假定$(x, n)=m$ ...

  5. codeblocks快捷键(转)

    ==日常编辑== • 按住Ctrl滚滚轮,代码的字体会随你心意变大变小.• 在编辑区按住右键可拖动代码,省去拉(尤其是横向)滚动条之麻烦:相关设置:Mouse Drag Scrolling.• Ctr ...

  6. Ubuntu无法进入图形界面的解决办法

    Ubuntu无法进入图形界面的解决办法 Ubuntu系统启动,输入用户密码后,屏幕显示彩色背景,但是始终不能进入图形界面. 如果你也遇到过这种情况,可以参照以下方法解决(在 ubuntu14.04 验 ...

  7. JAVA多线程提高一:传统线程技术&传统定时器Timer

    前面我们已经对多线程的基础知识有了一定的了解,那么接下来我们将要对多线程进一步深入的学习:但在学习之前我们还是要对传统的技术进行一次回顾,本章我们回顾的则是:传统线程技术和传统的定时器实现. 一.传统 ...

  8. .net core 中 identity server 4 之Topic --定义API资源

    想要让客户端能够访问API资源,就需要在Identity Server中定义好API的资源. Scope作用域:即API资源的访问范围限制. 作用域是一个资源 (通常也称为 Web API) 的标识符 ...

  9. vue使用jsx/axios拦截器设置

    最害怕的就是做过的事情,转几天又忘记了:写过的代码,也模模糊糊不知道哪里去了,所以告诉自己最好把每天遇到的问题记录下来,好,开始. 新公司要搭个vue后台框架,所以用了简简单单的 vue+iview+ ...

  10. html中插入其他html,并实现动态效果!

    <html> <body> 倒计时开始...... <span id="s1">888</span> <!--在html中先做 ...