SimpleDateFormat-多线程问题:

  SimpleDateFormat类在多线程环境下中处理日期,极易出现日期转换错误的情况

 1 import java.text.ParseException;
 2 import java.text.SimpleDateFormat;
 3 import java.util.Date;
 4
 5 /**
 6  *    线程类
 7  */
 8 public class MyThread extends Thread {
 9
10     private SimpleDateFormat sdf;
11     private String dateString;
12
13     public MyThread(SimpleDateFormat sdf,String dateString) {
14         this.sdf = sdf;
15         this.dateString = dateString;
16     }
17
18     @Override
19     public void run() {
20         try {
21             Date dateRef = sdf.parse(dateString);
22             String newDateString = sdf.format(dateRef).toString();
23             if(!newDateString.equals(dateString)) {
24                 System.out.println("ThreadName = " + Thread.currentThread().getName()
25                         + "报错了  日期字符串:" + dateString + "转换成日期为:" + newDateString);
26             }
27         } catch (ParseException e) {
28             e.printStackTrace();
29         }
30     }
31 }

 1 import java.text.SimpleDateFormat;
 2
 3 public class Test {
 4
 5     /**
 6      *    测试单例的SimpleDateFormat类在多线程环境下中处理日期,极易出现日期转换错误的情况
 7      */
 8     public static void main(String[] args) {
 9         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
10         String[] dateStringArray = new String[] {
11                 "2000-01-01","2000-01-02","2000-01-03",
12                 "2000-01-04","2000-01-05","2000-01-06",
13                 "2000-01-07","2000-01-08","2000-01-09",
14                 "2000-01-10"
15         };
16
17         MyThread[] threadArray = new MyThread[10];
18         for (int i = 0; i < 10; i++) {
19             threadArray[i] = new MyThread(sdf, dateStringArray[i]);
20         }
21         for (int i = 0; i < 10; i++) {
22             threadArray[i].start();
23         }
24     }
25 }

运行之后会输出很多的错误信息!

  解决多线程出现的问题-为每个线程实例一个SimpleDateFormat:

 1 import java.text.ParseException;
 2 import java.util.Date;
 3
 4 /**
 5  *    线程类
 6  */
 7 public class MyThread extends Thread {
 8
 9     private String dateString;
10     public MyThread(String dateString) {
11         this.dateString = dateString;
12     }
13
14     @Override
15     public void run() {
16         try {
17             Date dateRef = DateTools.parse("yyyy-MM-dd", dateString);
18             String newDateString = DateTools.format("yyyy-MM-dd",dateRef).toString();
19             if(!newDateString.equals(dateString)) {
20                 System.out.println("ThreadName = " + Thread.currentThread().getName()
21                         + "报错了  日期字符串:" + dateString + "转换成日期为:" + newDateString);
22             }
23         } catch (ParseException e) {
24             e.printStackTrace();
25         }
26     }
27 }

 1 import java.text.ParseException;
 2 import java.text.SimpleDateFormat;
 3 import java.util.Date;
 4
 5 /**
 6  *    日期格式化工具类
 7  */
 8 public class DateTools {
 9
10     public static Date parse(String formatPattern,String dateString) throws ParseException {
11         return new SimpleDateFormat(formatPattern).parse(dateString);
12     }
13
14     public static String format(String formatPattern,Date date) throws ParseException {
15         return new SimpleDateFormat(formatPattern).format(date).toString();
16     }
17 }

 1 public class Test {
 2
 3     /**
 4      *    测试,运行程序后,控制台没有任何输出,也就是转换没有任何异常,
 5      *    原理:创建了多个SimpleDateFormat实例
 6      */
 7     public static void main(String[] args) {
 8         String[] dateStringArray = new String[] {
 9                 "2000-01-01","2000-01-02","2000-01-03",
10                 "2000-01-04","2000-01-05","2000-01-06",
11                 "2000-01-07","2000-01-08","2000-01-09",
12                 "2000-01-10"
13         };
14
15         MyThread[] threadArray = new MyThread[10];
16         for (int i = 0; i < 10; i++) {
17             threadArray[i] = new MyThread(dateStringArray[i]);
18         }
19         for (int i = 0; i < 10; i++) {
20             threadArray[i].start();
21         }
22     }
23 }

  解决多线程出现的问题-使用ThreadLocal:

 1 import java.text.ParseException;
 2 import java.util.Date;
 3
 4 /**
 5  *    线程类
 6  */
 7 public class MyThread extends Thread {
 8
 9     private String dateString;
10     public MyThread(String dateString) {
11         this.dateString = dateString;
12     }
13
14     @Override
15     public void run() {
16         try {
17             Date dateRef = DateTools.getSimpleDateFormat("yyyy-MM-dd").parse(dateString);
18             String newDateString = DateTools.getSimpleDateFormat("yyyy-MM-dd").format(dateRef).toString();
19             if(!newDateString.equals(dateString)) {
20                 System.out.println("ThreadName = " + Thread.currentThread().getName()
21                         + "报错了  日期字符串:" + dateString + "转换成日期为:" + newDateString);
22             }
23         } catch (ParseException e) {
24             e.printStackTrace();
25         }
26     }
27 }

 1 import java.text.SimpleDateFormat;
 2
 3 /**
 4  *    日期格式化工具类,使用ThreadLocal解决SimpleDateFormat非线程安全问题
 5  */
 6 public class DateTools {
 7
 8     private static ThreadLocal<SimpleDateFormat> t1 = new ThreadLocal<>();
 9
10     public static SimpleDateFormat getSimpleDateFormat(String datePattern) {
11         SimpleDateFormat sdf = null;
12         sdf = t1.get();
13         if(sdf == null) {
14             sdf = new SimpleDateFormat(datePattern);
15             t1.set(sdf);
16         }
17         return sdf;
18     }
19 }

 1 public class Test {
 2
 3     /**
 4      *    测试,运行程序后,控制台没有任何输出,也就是转换没有任何异常
 5      *    原理:每个线程都会有自己的ThreadLocal存储全局变量,也就是每个线程都有自己的SimpleDateFormat实例
 6      */
 7     public static void main(String[] args) {
 8         String[] dateStringArray = new String[] {
 9                 "2000-01-01","2000-01-02","2000-01-03",
10                 "2000-01-04","2000-01-05","2000-01-06",
11                 "2000-01-07","2000-01-08","2000-01-09",
12                 "2000-01-10"
13         };
14
15         MyThread[] threadArray = new MyThread[10];
16         for (int i = 0; i < 10; i++) {
17             threadArray[i] = new MyThread(dateStringArray[i]);
18         }
19         for (int i = 0; i < 10; i++) {
20             threadArray[i].start();
21         }
22     }
23 }

转载于:https://www.cnblogs.com/wang1001/p/9585526.html

SimpleDateFormat-多线程问题相关推荐

  1. java.text.SimpleDateFormat多线程下的问题

    1. 今天在做性能压测的时候发现java.text.SimpleDateFormat多线程下的错误 2. 先贴出两段错误大家看一下: Exception in thread "pool-1- ...

  2. SparkStreaming编程

    0. SparkStreaming 流式计算简介 SparkStreaming实时处理入门案例 SparkStreaming和HDFS整合 SparkStreaming与Kafka整合 SparkSt ...

  3. JEECG 3.7.1版本发布,企业级JAVA快速开发平台

    JEECG 3.7.1 版本发布,企业级JAVA快速开发平台 ----------------------------------------  Version:  Jeecg_3.7.1 项 目:  ...

  4. Java日期时间类及计算

    1. Java中与日期相关的类 1.1 java.util包 类名 具体描述 Date Date对象算是JAVA中历史比较悠久的用于处理日期.时间相关的类了,但是随着版本的迭代演进,其中的众多方法都已 ...

  5. Java开发规范整理

    Java开发规范整理 (参考<Java开发手册嵩山版>) 文章目录 Java开发规范整理 一.编程规约 (一)命名 (二)常量定义 (三)代码格式 (四)OOP面向对象程序设计 (五)时间 ...

  6. 丢失的8小时去哪里了?SimpleDateFormat线程不安全,多线程初始化异常解决方案

    前言 本次参加了2月份的征文活动,说是对时间的处理问题,我这有2个点需要分享一下,一个是上大学的时候碰到的,还有就是在工作中遇到的由于[SimpleDateFormat线程不安全]在多线程时间初始化的 ...

  7. 多线程、并发及线程的基础问题

    1)Java 中能创建 volatile 数组吗? 能,Java 中可以创建 volatile 类型数组,不过只是一个指向数组的引用,而不是整个数组.我的意思是,如果改变引用指向的数组,将会受到 vo ...

  8. dateformat java 并发_java.text.DateFormat 多线程并发问题

    在日常开发中,java.text.DateFormat 应该算是使用频率比较高的一个工具类,经常会使用它 将 Date 对象转换成字符串日期,或者将字符串日期转化成 Date 对象.先来看一段眼熟的代 ...

  9. java 静态代码块 多线程,Java多线程编程笔记10:单例模式

    立即加载:"饿汉模式" 立即加载就是指使用类的时候已经将对象创建完毕,常见的实现方法就是直接new实例化.也就是在调用方法前,实例就被创建了.示例代码如下所示: class MyO ...

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

    转自:http://www.cnblogs.com/peida/archive/2013/05/31/3070790.html 想必大家对SimpleDateFormat并不陌生.SimpleDate ...

最新文章

  1. Laravel Dcat-admin 详情页多栏布局开发
  2. New Android Application 的介绍
  3. Winio驱动在64位windows下无法使用的解决方法
  4. 18岁辍学,22岁进谷歌和Jeff Dean谈笑风生,这样的我究竟需不需要本科文凭?
  5. java 企业门户网站 源码 自适应响应式 freemarker 静态引擎 html5 SSM
  6. CTF-Misc-CRC32碰撞脚本 (二)
  7. 多文件目录下makefile文件递归执行编译所有c文件 很不错
  8. outdated: 3.Adding Color
  9. trunk口_南京课工场IT培训:VLAN、Trunk与三层交换机的相关理论知识
  10. WPF RadioButton按钮控件取消选中设置
  11. QTableView自定义拖拽行
  12. Android之Http通信——1.初识Http协议
  13. 计算机网络中的分组交换是什么,什么是分组交换
  14. 软件可靠性测试概念与应用
  15. Python爬虫入门教程 25-100 知乎文章图片爬取器之一
  16. python测试request代理IP是否替换
  17. 使用单片机的串口蓝牙通信写的接收SBUF里的数据,并进行发送执行命令,显示在数码管上,波特率9600
  18. 自己封装的1200,1500PLC通过工艺轴方式控制伺服电机的FB块
  19. 网络-电脑网络突然变成球形, 网络不可用
  20. 全新2007高校BBS 睿智的冷笑话

热门文章

  1. 氩焊机器人编程_如何操作焊接机器人的编程?这六点是基础!
  2. string和数值之间的转换
  3. postman支持socket吗_如何使用postman测试接口webservice?
  4. java interface作用是什么_关于Java反射原理:
  5. 回归分析常数项t值没有显著异于零怎么办_洋蜜蜂统计辅导专题:回归分析关键词统计量须知...
  6. 算法萌新如何学好动态规划(三)
  7. php获取最后一条记录的id,获取MySQL的表中每个userid最后一条记录的方法_MySQL
  8. 卡爆mysql_荐 MySQL死锁和卡死分析
  9. linux 桌面共享xfce,漂亮而且轻量级的桌面-----xfce安装
  10. 简单聊聊智能硬件的固件测试