DateFormat 线程安全
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 线程安全的更多相关文章
- java.text.DateFormat 线程不安全问题
java.text下的 DateFormat 是线程不安全的: 建议1: 1.使用threadLocal包装DateFormat(太复杂,不推荐) 2.使用org.apache.commons.lan ...
- java8-新的日期API
背景 java的日期和时间API设计不理想,java8引入新的时间和日期API就是为了解决这个问题. 老的日期API的核心类 缺点 Date 月从0开始,年最小从1900年开始,没有时区的概念 Cal ...
- Java日期时间API系列1-----Jdk7及以前的日期时间类
先看一个简单的图: 主要的类有: Date类负责时间的表示,在计算机中,时间的表示是一个较大的概念,现有的系统基本都是利用从1970.1.1 00:00:00 到当前时间的毫秒数进行计时,这个时间称为 ...
- 《Java 8 in Action》Chapter 12:新的日期和时间API
在Java 1.0中,对日期和时间的支持只能依赖java.util.Date类.同时这个类还有两个很大的缺点:年份的起始选择是1900年,月份的起始从0开始. 在Java 1.1中,Date类中的很多 ...
- DateFormat 竟然是非线程安全的?!!!!!
今天撸代码忽然发现一个奇怪的一场抛出,经过一番排查发现有可能DateFormat 的多线程问题造成的,网上一查DateFormat竟然非线程安全.那我原先的代码...(细思极恐)
- 第三章 线程安全的DateFormat工具类
1.使用threadLocal包装DateFormat(太复杂,不推荐) 2.使用org.apache.commons.lang3.time.DateFormatUtils下的方法(推荐) DateF ...
- DateFormat的format()方法线程不安全的问题分析
最近看到<侦探剧场:堆内存神秘溢出事件>https://my.oschina.net/u/2368090/blog/1628720,于是自己也想测试了解一下DateFormat的多线程安全 ...
- java 多线程:线程安全问题,示例DateFormat多线程执行冲突解决方案ThreadLocal、方法内变量
SimpleDateFormat多线程中执行报错 java.lang.NumberFormatException: For input string: "" import ja ...
- Spring单例模式与线程安全
问题背景 这段时间在做项目的时候,考虑到Spring中的bean默认是单例模式的,那么当多个线程调用同一个bean的时候就会存在线程安全问题.如果是Spring中bean的创建模式为非单例的,也就不存 ...
随机推荐
- Codeforces 807 A Is it rated?
http://codeforces.com/problemset/problem/807/A A. Is it rated? time limit per test 2 se ...
- HDU 2619 完全剩余类 原根
求有多少$i(<=n-1)$,使 $x^i \mod n$的值为$[1,n-1]$,其实也就是满足完全剩余类的原根数量.之前好像在二次剩余的讲义PPT里看到这个过. 直接有个定理,如果模k下有 ...
- Qt undefined reference to ***
错因:某个类声明了一个函数但是没有定义就直接使用.
- 您是哪个等级的CSS开发人员?
我们在不断的学习,追求进步与提高,到底学到什么程度了,到底是 不是真的了解CSS,是哪个层次了呢.我们来对照一下. 第0级:CSS?那不是一个多人射击游戏吗? CSS? Isn't that a m ...
- 【VIJOS】P1512 SuperBrother打鼹鼠
[算法]二维树状数组 [题解] 1.树状数组尽量不要出现0,因此所有坐标+1 2.面积求法(默认1开始):(x1,y1)(x2,y2)=sum(x2,y2)-sum(x1-1,y2)-sum(x2,y ...
- C语言实现线性表(链式存储方式)
#include <stdio.h> #include <stdlib.h> //提供malloc()原型 typedef struct LNode *List; typede ...
- JS设计模式——1.富有表现力的JS
创建支持链式调用的类(构造函数+原型) Function.prototype.method = function(name, fn){ this.prototype[name] = fn; retur ...
- Go语言 6 结构体、方法和接口
文章由作者马志国在博客园的原创,若转载请于明显处标记出处:http://www.cnblogs.com/mazg/ Go学习群:415660935 结构体(struct)是由一系列具有相同类型或不同类 ...
- cin循环输入控制问题
之前写一个简单的输入节点值自动生成链表的测试程序,发现cin的输入控制好像在VC++6.0和VS2010中不一样,特此记录. 现在有以下代码: vector<int> ivec; int ...
- 利用gcc的__attribute__编译属性section子项构建初始化函数表【转】
转自:https://my.oschina.net/u/180497/blog/177206 gcc的__attribute__编译属性有很多子项,用于改变作用对象的特性.这里讨论section子项的 ...