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的创建模式为非单例的,也就不存 ...
随机推荐
- Latent Semantic Analysis(LSA/ LSI)原理简介
LSA的工作原理: How Latent Semantic Analysis Works LSA被广泛用于文献检索,文本分类,垃圾邮件过滤,语言识别,模式检索以及文章评估自动化等场景. LSA其中一个 ...
- Linux上怎么快速删除一个目录
删除文件需要用到rm命令,但删除目录需要添加两个参数: -r 向下递归,不管多少级目录都删除 -f 强行删除,不做提示 #rm -rf 文件目录名
- Anagrams by Stack(深度优先搜索)
ZOJ Problem Set - 1004 Anagrams by Stack Time Limit: 2 Seconds Memory Limit: 65536 KB How can a ...
- [csp-201809-3]元素选择器-编译原理
声明:同样是参考照抄hyh学长的代码!(有问题我马上删这篇emm 题目链接:http://118.190.20.162/view.page?gpid=T77 题面: 这棵树的样子(同样是来自学长的图) ...
- 【leetcode 简单】 第七题 合并两个有序链表
将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1->1->2- ...
- 【译】第一篇 SQL Server代理概述
本篇文章是SQL Server代理系列的第一篇,详细内容请参考原文. SQL Server代理是SQL Server的作业调度和告警服务,如果使用得当,它可以大大简化DBA的工作量.SQL Serve ...
- linux学习记录.2.hello world.c
安装vim,指令: sudo apt-get install vim 建立一个子目录WorkSpace,指令 mkdir WorkSpace 转到该目录下,指令 cd WorkSpace 新建c文件, ...
- VideoJS 与 Framework7 中 fastclick 冲突问题
Framework7 由于自动启用 fastclick,会导致在 移动端下使用 video.js,控制条上的 播放和音量按钮 点击的时候会触发两次. 解决办法: 1. 全局禁用 fastclick, ...
- Linux Kernel代码艺术——数组初始化【转】
转自:http://www.cnblogs.com/hazir/p/array_initialization.html 前几天看内核中系统调用代码,在系统调用向量表初始化中,有下面这段代码写的让我有点 ...
- MySQL之——如何添加新数据库到MySQL主从复制列表 【转】
转自 转载请注明出处:http://blog.csdn.net/l1028386804/article/details/54653691 MySQL主从复制一般情况下我们会设置需要同步的数据库,使用参 ...