SimpleDateFormat-多线程问题:

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

 import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date; /**
* 线程类
*/
public class MyThread extends Thread { private SimpleDateFormat sdf;
private String dateString; public MyThread(SimpleDateFormat sdf,String dateString) {
this.sdf = sdf;
this.dateString = dateString;
} @Override
public void run() {
try {
Date dateRef = sdf.parse(dateString);
String newDateString = sdf.format(dateRef).toString();
if(!newDateString.equals(dateString)) {
System.out.println("ThreadName = " + Thread.currentThread().getName()
+ "报错了 日期字符串:" + dateString + "转换成日期为:" + newDateString);
}
} catch (ParseException e) {
e.printStackTrace();
}
}
}
 import java.text.SimpleDateFormat;

 public class Test {

     /**
* 测试单例的SimpleDateFormat类在多线程环境下中处理日期,极易出现日期转换错误的情况
*/
public static void main(String[] args) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String[] dateStringArray = new String[] {
"2000-01-01","2000-01-02","2000-01-03",
"2000-01-04","2000-01-05","2000-01-06",
"2000-01-07","2000-01-08","2000-01-09",
"2000-01-10"
}; MyThread[] threadArray = new MyThread[10];
for (int i = 0; i < 10; i++) {
threadArray[i] = new MyThread(sdf, dateStringArray[i]);
}
for (int i = 0; i < 10; i++) {
threadArray[i].start();
}
}
}

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

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

 import java.text.ParseException;
import java.util.Date; /**
* 线程类
*/
public class MyThread extends Thread { private String dateString;
public MyThread(String dateString) {
this.dateString = dateString;
} @Override
public void run() {
try {
Date dateRef = DateTools.parse("yyyy-MM-dd", dateString);
String newDateString = DateTools.format("yyyy-MM-dd",dateRef).toString();
if(!newDateString.equals(dateString)) {
System.out.println("ThreadName = " + Thread.currentThread().getName()
+ "报错了 日期字符串:" + dateString + "转换成日期为:" + newDateString);
}
} catch (ParseException e) {
e.printStackTrace();
}
}
}
 import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date; /**
* 日期格式化工具类
*/
public class DateTools { public static Date parse(String formatPattern,String dateString) throws ParseException {
return new SimpleDateFormat(formatPattern).parse(dateString);
} public static String format(String formatPattern,Date date) throws ParseException {
return new SimpleDateFormat(formatPattern).format(date).toString();
}
}
 public class Test {

     /**
* 测试,运行程序后,控制台没有任何输出,也就是转换没有任何异常,
* 原理:创建了多个SimpleDateFormat实例
*/
public static void main(String[] args) {
String[] dateStringArray = new String[] {
"2000-01-01","2000-01-02","2000-01-03",
"2000-01-04","2000-01-05","2000-01-06",
"2000-01-07","2000-01-08","2000-01-09",
"2000-01-10"
}; MyThread[] threadArray = new MyThread[10];
for (int i = 0; i < 10; i++) {
threadArray[i] = new MyThread(dateStringArray[i]);
}
for (int i = 0; i < 10; i++) {
threadArray[i].start();
}
}
}

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

 import java.text.ParseException;
import java.util.Date; /**
* 线程类
*/
public class MyThread extends Thread { private String dateString;
public MyThread(String dateString) {
this.dateString = dateString;
} @Override
public void run() {
try {
Date dateRef = DateTools.getSimpleDateFormat("yyyy-MM-dd").parse(dateString);
String newDateString = DateTools.getSimpleDateFormat("yyyy-MM-dd").format(dateRef).toString();
if(!newDateString.equals(dateString)) {
System.out.println("ThreadName = " + Thread.currentThread().getName()
+ "报错了 日期字符串:" + dateString + "转换成日期为:" + newDateString);
}
} catch (ParseException e) {
e.printStackTrace();
}
}
}
 import java.text.SimpleDateFormat;

 /**
* 日期格式化工具类,使用ThreadLocal解决SimpleDateFormat非线程安全问题
*/
public class DateTools { private static ThreadLocal<SimpleDateFormat> t1 = new ThreadLocal<>(); public static SimpleDateFormat getSimpleDateFormat(String datePattern) {
SimpleDateFormat sdf = null;
sdf = t1.get();
if(sdf == null) {
sdf = new SimpleDateFormat(datePattern);
t1.set(sdf);
}
return sdf;
}
}
 public class Test {

     /**
* 测试,运行程序后,控制台没有任何输出,也就是转换没有任何异常
* 原理:每个线程都会有自己的ThreadLocal存储全局变量,也就是每个线程都有自己的SimpleDateFormat实例
*/
public static void main(String[] args) {
String[] dateStringArray = new String[] {
"2000-01-01","2000-01-02","2000-01-03",
"2000-01-04","2000-01-05","2000-01-06",
"2000-01-07","2000-01-08","2000-01-09",
"2000-01-10"
}; MyThread[] threadArray = new MyThread[10];
for (int i = 0; i < 10; i++) {
threadArray[i] = new MyThread(dateStringArray[i]);
}
for (int i = 0; i < 10; i++) {
threadArray[i].start();
}
}
}

SimpleDateFormat-多线程问题的更多相关文章

  1. ThreadLocal解决SimpleDateFormat多线程安全问题中遇到的困惑

    测试代码: public class Main { public static void main(String[] args) { for (int k = 0; k < 10; k++) { ...

  2. java 多线程:线程安全问题,示例DateFormat多线程执行冲突解决方案ThreadLocal、方法内变量

    SimpleDateFormat多线程中执行报错 java.lang.NumberFormatException: For input string: ""   import ja ...

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

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

  4. ThreadLocal知识点

    ThreadLocal是什么 ThreadLocal 表面上看他是和多线程,线程同步有关的一个工具类,但其实他与线程同步机制无关.线程同步机制是多个线程共享同一个变量,而ThreadLocal是为每个 ...

  5. JAVA中计算两个日期时间的差值竟然也有这么多门道

    上半年春招的时候,作为面试官,对于面试表现的不错的同学会要求其写一小段代码看看.题目很简单: 给定一个日期,然后计算下距离今天相差的天数. 本以为这么个问题就是用来活跃面试氛围的,但是结果却让人大跌眼 ...

  6. SimpleDateFormat做成员或者静态成员多线程安全隐患

    转自:http://blog.csdn.net/jeamking/article/details/7183958 有时我们在同一个类中都是使用同一种日期格式,又或者为了减少new SimpleDate ...

  7. 【多线程补充】SimpleDateFormat非线程安全与线程中、线程组中异常的处理

    1.SimpleDateFormat非线程安全的问题 类SimpleDateFormat主要负责日期的转换与格式化,但在多线程环境中,使用此类容易造成数据转换及处理的不正确,因为SimpleDateF ...

  8. Java多线程:SimpleDateFormat

    一.SimpleDateFormat的线程安全问题 为什么SimpleDateFormat是线程不安全的? 下面通过一个案例代码来说明 public class DateUtilTest { publ ...

  9. Java多线程(三)SimpleDateFormat

    多线程报错:java.lang.NumberFormatException: multiple points SimpleDateFormat是非线程安全的,在多线程情况下会有问题,在每个线程下得各自 ...

  10. 多线程避免使用SimpleDateFormat及替代方案

    先来看一个多线程下使用例子,看到运行结果会出现异常: import java.text.DateFormat; import java.text.SimpleDateFormat; import ja ...

随机推荐

  1. oralce 索引(1)

    本文来自网上整理 来自以下博客内容 http://www.360doc.com/content/13/0712/11/13136648_299364992.shtml; http://www.cnbl ...

  2. 分布式事务_01_2PC框架raincat快速体验

    一.前言 关于2PC的理论知识请见:分布式_理论_03_2PC 这一节我们来看下github上一个优秀的2PC分布式事务开源框架的快速体验. 二.源码 源码请见: https://github.com ...

  3. CSS 文本实例

    1.设置文本的颜色 color:red; color:#00ff00 color:rgb(0,0,255) 2.增加或减少字符间距 letter-spacing:-0.5em letter-spaci ...

  4. 浅学soap--------1

    无wsdl文件: Clint.php //客户端 <?php $soap = new SoapClient(null,array('uri'=>'server','location'=&g ...

  5. centos6下搭建gitlab

    gitlab安装方法,最新安装方法见官网:https://www.gitlab.com.cn/installation/#centos-6 1.在 Centos 6 系统上, 下面的命令将在系统防火墙 ...

  6. (转)Linux sort命令

    Linux 的 ‘sort’命令的14个有用的范例(一) 2015-5-2 10:29    评论: 3 收藏: 10 编译自:http://www.tecmint.com/sort-command- ...

  7. idea 创建maven工程(入门)

    转:http://blog.csdn.net/qq_32588349/article/details/51461182 1. 下载Maven 官方地址:http://maven.apache.org/ ...

  8. Python 2.7_爬取妹子图网站单页测试图片_20170114

    1.url= http://www.mzitu.com/74100/x,2为1到23的值 2.用到模块 os 创建文件目录; re模块正则匹配目录名 图片下载地址; time模块 限制下载时间;req ...

  9. vertex shader must minimally write all four components of POSITION

    Though the POSITION semantic must be written out by the vertex shader, it cannot be read in by the p ...

  10. UML类图与类的关系详解【转】

    在画类图的时候,理清类和类之间的关系是重点. 类的关系有泛化(Generalization).实现(Realization).依赖(Dependency)和关联(Association).其中关联又分 ...