`

SimpleDateFormat 线程安全的问题

    博客分类:
  • Java
 
阅读更多

SimpleDateFormat中的日期格式不是同步的。推荐(建议)为每个线程创建独立的格式实例。如果多个线程同时访问一个格式,则它必须保持外部同步

 

JDK原始文档如下:

Synchronization

 

Date formats are not synchronized. It is recommended to create separate format instances for each thread. If multiple threads access a format concurrently, it must be synchronized externally.

 

 

如下内容摘自:http://www.111cn.net/jsp/Java/38190.htm

在java项目中,我们通常会自己写一个dateutil类,处理日期和字符串的转换。如下

public class dateutil{
      private static simpledateformat sdf = new simpledateformat("yyyymmdd");



     public static formatdatetoyyyymmddstr(date date){
              return sdf.format(date);
     }


      public static formatyyyymmddstrtodate(string str){

            return sdf.parse(str);
      }
}

 

然而,由于simpledateformat类不是线程安全的,所以在多线程的环境下,往往会出现意想不到的结果。

 

有三种方法可以解决以上问题。

1)每次使用时,都创建一个新的simpledateformat实例。如果使用不是很频繁时,可以使用此方法,这样可以降低创建新对象的开销。

2)使用同步:

public class dateutil{
        private simpledateformat sdf = new    simpledateformat("yyyymmdd");

   private date parse(string datestr) throws parseexception{
      synchronized(sdf){
           return sdf.parse(datestr);
      }
  }
   private string format(date date){
     synchronized(sdf){
         return sdf.format(datestr);
     }
  }
}
 不过,当线程较多时,当一个线程调用该方法时,其他想要调用此方法的线程就要block,这样的操作也会一定程度上影响性能。

个人最推荐的是第三种方法,那就是借助threadlocal对象每个线程只创建一个实例。

public class dateutil {
 
 private static final string date_format = "yyyymmdd";
 
 @suppresswarnings("rawtypes")
 private static threadlocal threadlocal = new threadlocal() {
  protected synchronized object initialvalue() {
   return new simpledateformat(date_format);
  }
 };
 
 public static dateformat getdateformat() {
  return (dateformat) threadlocal.get();
 }
 
 public static date parse(string textdate) throws parseexception {
  return getdateformat().parse(textdate);
 }
}
 
分享到:
评论

相关推荐

    ThreadLocal:如何优雅的解决SimpleDateFormat多线程安全问题

    目录SimpleDateFormat诡异bug复现SimpleDateFormat诡异bug字符串日期转Date日期(parse)Date日期转String类型(format)SimpleDateFormat出现...事项使用ThreadLocal解决SimpleDateFormat线程安全问题总结...

    Java SimpleDateFormat线程安全问题原理详解

    主要介绍了Java SimpleDateFormat线程安全问题原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    详解SimpleDateFormat的线程安全问题与解决方案

    主要介绍了SimpleDateFormat的线程安全问题与解决方案,非常不错,具有参考借鉴价值,需要的朋友可以参考下

    高并发之-SimpleDateFormat类的线程安全问题和解决方案.docx

    高并发之-SimpleDateFormat类的线程安全问题和解决方案.docx

    关于SimpleDateFormat的非线程安全问题及其解决方案.docx

    关于SimpleDateFormat的非线程安全问题及其解决方案.docx

    深入理解Java:SimpleDateFormat安全的时间格式化

    SimpleDateFormat 是 Java 中一个非常常用的类,该类用来对日期字符串进行解析和格式化输出,但如果使用不小心会导致非常微妙和难以调试的问题,因为 DateFormat 和 SimpleDateFormat 类不都是线程安全的,在多线程...

    软件安全监测报告.pdf

    这份软件安全监测报告主要是监测java开发程序中出现的安全问题,找了一个项目程序监测后出现的原版报告显示,在使用DES加解密的情况下,会被检测...还有关于SimpleDateFormat线程不安全的问题,都有详细解释及处理方法

    JavaSE 之 传统日期格式化的线程问题

    需求:让多线程同时去解析日期 错误示范 public class Test1 { @Test public void test01() throws Exception { //格式化日期类 SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); //任务类:用于...

    java大学实用教程课件

    面向对象编程是一种先进的编程思想,更加容易解决复杂的问题。 3.多线程 Java的特点之一就是内置对多线程的支持。多线程允许同时完成多个任务。 4.安全 5.动态 1.4 java 与C/C++之关系 如果你学习过C++语言,...

    JAVA基础课程讲义

    线程同步和死锁问题 175 死锁及解决方案 179 生产者/消费者模式 181 线程回顾总结 184 任务调度(补充内容,了解即可!) 184 思考作业 185 上机作业 185 第十章 网络编程 186 基本概念 186 什么是计算机网络 186 ...

    java面试题

    Collections是针对集合类的帮助类,它提供了一系列针对集合的搜索,排序,线程安全化等操作。 final、finally、finalize的区别? 答:final用于声明属性方法和类,分别表示:属性不可变,方法不可覆盖,类不可继承...

    Java范例开发大全(全书源程序)

    实例194 使用SimpleDateFormat类获取系统的当前时间 329 实例195 显示某年某月某一周的信息 330 实例196 显示某年某月的信息 332 实例197 时间的设置与获取 334 实例198 万年历(农历和阳历的互换) 337 11.4 ...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例140 解决线程的死锁问题 182 6.3 线程的进阶 183 实例141 使用阻塞队列实现线程同步 183 实例142 新建有返回值的线程 184 实例143 使用线程池优化多线程编程 186 实例144 Object类中线程相关的方法 187 实例145 ...

    Java范例开发大全 (源程序)

     实例194 使用SimpleDateFormat类获取系统的当前时间 329  实例195 显示某年某月某一周的信息 330  实例196 显示某年某月的信息 332  实例197 时间的设置与获取 334  实例198 万年历(农历和阳历的互换) ...

    java范例开发大全(pdf&源码)

    实例194 使用SimpleDateFormat类获取系统的当前时间 329 实例195 显示某年某月某一周的信息 330 实例196 显示某年某月的信息 332 实例197 时间的设置与获取 334 实例198 万年历(农历和阳历的互换) 337 11.4 ...

    java范例开发大全源代码

     实例194 使用SimpleDateFormat类获取系统的当前时间 329  实例195 显示某年某月某一周的信息 330  实例196 显示某年某月的信息 332  实例197 时间的设置与获取 334  实例198 万年历(农历和阳历的互换...

Global site tag (gtag.js) - Google Analytics