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. Latent Semantic Analysis(LSA/ LSI)原理简介

    LSA的工作原理: How Latent Semantic Analysis Works LSA被广泛用于文献检索,文本分类,垃圾邮件过滤,语言识别,模式检索以及文章评估自动化等场景. LSA其中一个 ...

  2. Linux上怎么快速删除一个目录

    删除文件需要用到rm命令,但删除目录需要添加两个参数: -r  向下递归,不管多少级目录都删除 -f  强行删除,不做提示 #rm -rf 文件目录名

  3. Anagrams by Stack(深度优先搜索)

    ZOJ Problem Set - 1004 Anagrams by Stack Time Limit: 2 Seconds      Memory Limit: 65536 KB How can a ...

  4. [csp-201809-3]元素选择器-编译原理

    声明:同样是参考照抄hyh学长的代码!(有问题我马上删这篇emm 题目链接:http://118.190.20.162/view.page?gpid=T77 题面: 这棵树的样子(同样是来自学长的图) ...

  5. 【leetcode 简单】 第七题 合并两个有序链表

    将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1->1->2- ...

  6. 【译】第一篇 SQL Server代理概述

    本篇文章是SQL Server代理系列的第一篇,详细内容请参考原文. SQL Server代理是SQL Server的作业调度和告警服务,如果使用得当,它可以大大简化DBA的工作量.SQL Serve ...

  7. linux学习记录.2.hello world.c

    安装vim,指令: sudo apt-get install vim 建立一个子目录WorkSpace,指令 mkdir WorkSpace 转到该目录下,指令 cd WorkSpace 新建c文件, ...

  8. VideoJS 与 Framework7 中 fastclick 冲突问题

    Framework7 由于自动启用  fastclick,会导致在 移动端下使用 video.js,控制条上的 播放和音量按钮 点击的时候会触发两次. 解决办法: 1. 全局禁用 fastclick, ...

  9. Linux Kernel代码艺术——数组初始化【转】

    转自:http://www.cnblogs.com/hazir/p/array_initialization.html 前几天看内核中系统调用代码,在系统调用向量表初始化中,有下面这段代码写的让我有点 ...

  10. MySQL之——如何添加新数据库到MySQL主从复制列表 【转】

    转自 转载请注明出处:http://blog.csdn.net/l1028386804/article/details/54653691 MySQL主从复制一般情况下我们会设置需要同步的数据库,使用参 ...