SimpleDateFormat-多线程问题
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-多线程问题的更多相关文章
- ThreadLocal解决SimpleDateFormat多线程安全问题中遇到的困惑
测试代码: public class Main { public static void main(String[] args) { for (int k = 0; k < 10; k++) { ...
- java 多线程:线程安全问题,示例DateFormat多线程执行冲突解决方案ThreadLocal、方法内变量
SimpleDateFormat多线程中执行报错 java.lang.NumberFormatException: For input string: "" import ja ...
- JEECG 3.7.1 版本发布,企业级JAVA快速开发平台
JEECG 3.7.1 版本发布,企业级JAVA快速开发平台 ---------------------------------------- Version: Jeecg_3.7.1项 目: ...
- ThreadLocal知识点
ThreadLocal是什么 ThreadLocal 表面上看他是和多线程,线程同步有关的一个工具类,但其实他与线程同步机制无关.线程同步机制是多个线程共享同一个变量,而ThreadLocal是为每个 ...
- JAVA中计算两个日期时间的差值竟然也有这么多门道
上半年春招的时候,作为面试官,对于面试表现的不错的同学会要求其写一小段代码看看.题目很简单: 给定一个日期,然后计算下距离今天相差的天数. 本以为这么个问题就是用来活跃面试氛围的,但是结果却让人大跌眼 ...
- SimpleDateFormat做成员或者静态成员多线程安全隐患
转自:http://blog.csdn.net/jeamking/article/details/7183958 有时我们在同一个类中都是使用同一种日期格式,又或者为了减少new SimpleDate ...
- 【多线程补充】SimpleDateFormat非线程安全与线程中、线程组中异常的处理
1.SimpleDateFormat非线程安全的问题 类SimpleDateFormat主要负责日期的转换与格式化,但在多线程环境中,使用此类容易造成数据转换及处理的不正确,因为SimpleDateF ...
- Java多线程:SimpleDateFormat
一.SimpleDateFormat的线程安全问题 为什么SimpleDateFormat是线程不安全的? 下面通过一个案例代码来说明 public class DateUtilTest { publ ...
- Java多线程(三)SimpleDateFormat
多线程报错:java.lang.NumberFormatException: multiple points SimpleDateFormat是非线程安全的,在多线程情况下会有问题,在每个线程下得各自 ...
- 多线程避免使用SimpleDateFormat及替代方案
先来看一个多线程下使用例子,看到运行结果会出现异常: import java.text.DateFormat; import java.text.SimpleDateFormat; import ja ...
随机推荐
- oralce 索引(1)
本文来自网上整理 来自以下博客内容 http://www.360doc.com/content/13/0712/11/13136648_299364992.shtml; http://www.cnbl ...
- 分布式事务_01_2PC框架raincat快速体验
一.前言 关于2PC的理论知识请见:分布式_理论_03_2PC 这一节我们来看下github上一个优秀的2PC分布式事务开源框架的快速体验. 二.源码 源码请见: https://github.com ...
- CSS 文本实例
1.设置文本的颜色 color:red; color:#00ff00 color:rgb(0,0,255) 2.增加或减少字符间距 letter-spacing:-0.5em letter-spaci ...
- 浅学soap--------1
无wsdl文件: Clint.php //客户端 <?php $soap = new SoapClient(null,array('uri'=>'server','location'=&g ...
- centos6下搭建gitlab
gitlab安装方法,最新安装方法见官网:https://www.gitlab.com.cn/installation/#centos-6 1.在 Centos 6 系统上, 下面的命令将在系统防火墙 ...
- (转)Linux sort命令
Linux 的 ‘sort’命令的14个有用的范例(一) 2015-5-2 10:29 评论: 3 收藏: 10 编译自:http://www.tecmint.com/sort-command- ...
- idea 创建maven工程(入门)
转:http://blog.csdn.net/qq_32588349/article/details/51461182 1. 下载Maven 官方地址:http://maven.apache.org/ ...
- Python 2.7_爬取妹子图网站单页测试图片_20170114
1.url= http://www.mzitu.com/74100/x,2为1到23的值 2.用到模块 os 创建文件目录; re模块正则匹配目录名 图片下载地址; time模块 限制下载时间;req ...
- 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 ...
- UML类图与类的关系详解【转】
在画类图的时候,理清类和类之间的关系是重点. 类的关系有泛化(Generalization).实现(Realization).依赖(Dependency)和关联(Association).其中关联又分 ...