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. JS中的匿名函数自执行、函数声明与函数表达式

    先看一段jQuery源码中匿名函数自执行的例子: (function( window, undefined ) { // jquery code })(window); 另外一种常见的写法: +fun ...

  2. Eclipse中使用Maven创建项目 (转)

    转自:http://www.gogogogo.me/development/eclipse-maven-webapp.html       Apache Maven是一个优秀的项目构建和管理工具,许多 ...

  3. jdbc:oracle:thin:@localhost:1521:orcl和jdbc:oracle:thin:@localhost:1521/orcl的区别

      Oracle Thin JDBC Driver 驱动程序包名:ojdbc14.jar.ojdbc6.jar 驱动程序类名: oracle.jdbc.driver.OracleDriver JDBC ...

  4. HDU 4990 Reading comprehension 简单矩阵快速幂

    Problem Description Read the program below carefully then answer the question.#pragma comment(linker ...

  5. 使用 jQuery 避免鼠标双击

    介绍 当用户双击DOM对象(例如按钮和链接等)时,对于用户交互一直是个麻烦的问题. 幸运的是, jQuery 提供了一个相当棒的解决方法. 那就是.one(). .one()这个方法是做什么的? 它附 ...

  6. session_write_close()的作用

    简单地说,当开启session_start以后,这个session会一直开启,并且被一个用户使用.其他用户开启session的话要等待第一个session用户关闭以后才可以开启sessio,这样就造成 ...

  7. java学习笔记记录

    Java内存模型: Java虚拟机规范中将Java运行时数据分为六种. 1.程序计数器:是一个数据结构,用于保存当前正常执行的程序的内存地址.Java虚拟机的多线程就是通过线程轮流切换并分配处理器时间 ...

  8. 【洛谷 P2120】 [ZJOI2007]仓库建设(斜率优化)

    题目链接 斜率优化+1,好吧不水分了. 玩具装箱那题以后再做,当作复习吧. \(f[i]=f[j]-(sum[i]-sum[j])*dis[i]+p[i]\) \(f[j]=-dis[i]*sum[j ...

  9. Date对象相关函数使用

    参考:http://www.w3school.com.cn/jsref/jsref_obj_date.asp

  10. webgote的例子(4)Sql注入(SelectGET)

    SQL Injection (Select/GET) 本章内容 (查询显示中要注意的错误) 这里面我们看一下 movie的数值,选择表单中的当我们选择的二个的时候 move的值也变成了第二个,选择表单 ...