当前位置: 首页 > news >正文

潍坊高端网站建设公司考研培训班集训营

潍坊高端网站建设公司,考研培训班集训营,网站制作标准,智能展厅设计公司目录 前言 正文 1.出现异常 2.解决方法1 3.解决方法2 总结 前言 SimpleDateFormat 类是 Java 中处理日期和时间格式化和解析的类,但它并不是线程安全的。这意味着多个线程不能安全地共享一个 SimpleDateFormat 实例进行日期和时间的解析和格式化。当多个…

目录

前言 

正文 

1.出现异常 

2.解决方法1 

3.解决方法2 

总结


前言 

SimpleDateFormat 类是 Java 中处理日期和时间格式化和解析的类,但它并不是线程安全的。这意味着多个线程不能安全地共享一个 SimpleDateFormat 实例进行日期和时间的解析和格式化。当多个线程共享同一个 SimpleDateFormat 实例时,会因为 SimpleDateFormat 内部维护的日历字段(例如:Calendar 对象)等的竞争条件而导致解析和格式化错误。


正文 

类 SimpleDataFormat 的可以对日期进行解析与格式化,但在使用时如果不想使用 0 进行填充,比如 2000-01-02 只想转换成 2002-1-2 ,我们需要在代码上进行处理,示例代码如下。 

package org.example.SimpleDataFormat;import java.text.ParseException;
import java.text.SimpleDateFormat;public class Run {public static void main(String[] args) throws ParseException {String dataString1 = "2000-1-1";String dataString2 = "2000-11-18";SimpleDateFormat format1 = new SimpleDateFormat("yyyy-M-d");SimpleDateFormat format2 = new SimpleDateFormat("yyyy-MM-dd");//先按照日期模式将字符串解析成日期再格式化成时间字符串。System.out.println(format1.format(format1.parse(dataString1)));System.out.println(format2.format(format2.parse(dataString1)));System.out.println(format1.format(format1.parse(dataString2)));System.out.println(format2.format(format2.parse(dataString2)));}
}

打印结果如下:

但 SimpleDateFormat 在多线程环境中使用类容易造成数据转换及处理不准确,因为类 SimpleDateFormat 并不是线程安全的。  

1.出现异常 

本示例将展示使用类 SimpleDataFormat 在多线程环境中处理日期时得到错误结果,这也是在多线程环境中开发经常遇到的问题。 

ackage org.example.SimpleDataFormat;import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;public class formatError {static class MyThread extends Thread {private SimpleDateFormat sdf;private String dateString;public MyThread(SimpleDateFormat sdf, String dateString) {this.sdf = sdf;this.dateString = dateString;}@Overridepublic void run() {try {Date dateRef = sdf.parse(dateString);String newDataString = sdf.format(dateRef);if (!newDataString.equals(dateString)) {System.out.println("ThreadName=" + this.getName()+ "报错了 日期字符串:" + dateString + " 转换成的日期为:"+ newDataString);}} catch (ParseException e) {e.printStackTrace();}}}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[] threads = new MyThread[10];for (int i = 0; i < 10; i++) {threads[i] = new MyThread(sdf,dateStringArray[i]);}for (int i = 0; i < 10; i++) {threads[i].start();}}
}

运行结果如图:

  

从打印的结果来看,使用单例的类 SimpleDateFormat 在多线程环境中处理日期极易出现转换错误的情况。 

甚至由于竞争导致解析逻辑的数字处理部分冲突,控制台照成了错误输出 。

2.解决方法1 

第一种解决办法的原理是满足竞争,创建多个类 SimpleDateFormat 的实例。 

package org.example.SimpleDataFormat;import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;public class formatOK1 {static 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) {return new SimpleDateFormat(formatPattern).format(date);}}static class MyThread extends Thread {private SimpleDateFormat sdf;private String dateString;public MyThread(SimpleDateFormat sdf, String dateString) {this.sdf = sdf;this.dateString = dateString;}@Overridepublic void run() {try {Date dateRef = DateTools.parse("yyyy-MM-dd",dateString);String newDataString = DateTools.format("yyyy-MM-dd",dateRef);if (!newDataString.equals(dateString)) {System.out.println("ThreadName=" + this.getName()+ "报错了 日期字符串:" + dateString + " 转换成的日期为:"+ newDataString);}} catch (ParseException e) {e.printStackTrace();}}}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[] threads = new MyThread[10];for (int i = 0; i < 10; i++) {threads[i] = new MyThread(sdf,dateStringArray[i]);}for (int i = 0; i < 10; i++) {threads[i].start();}}
}

运行结果如图:

控制台没有异常信息输出。

3.解决方法2 

还有一种更简单的方法,那就是使用 ThreadLocal 包装SimpleDateFormat。ThreadLocal 可以为每个线程提供一个单独的 SimpleDateFormat 实例,能使线程绑定到指定对象。使用该类也可以解决多线程环境中类 SimpleDateFormat 处理日期时出现错误的问题。

package org.example.SimpleDataFormat;import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;public class formatOK2 {static 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;}}static class MyThread extends Thread {private SimpleDateFormat sdf;private String dateString;public MyThread(SimpleDateFormat sdf, String dateString) {this.sdf = sdf;this.dateString = dateString;}@Overridepublic void run() {try {Date dateRef = DateTools.getSimpleDateFormat("yyyy-MM-dd").parse(dateString);String newDataString = DateTools.getSimpleDateFormat("yyyy-MM-dd").format(dateRef);if (!newDataString.equals(dateString)) {System.out.println("ThreadName=" + this.getName()+ "报错了 日期字符串:" + dateString + " 转换成的日期为:"+ newDataString);}} catch (ParseException e) {e.printStackTrace();}}}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[] threads = new MyThread[10];for (int i = 0; i < 10; i++) {threads[i] = new MyThread(sdf, dateStringArray[i]);}for (int i = 0; i < 10; i++) {threads[i].start();}}
}

运行结果:

控制台没有异常信息输出,说明 ThreadLocal 解决了 SimpleDateFormat 非线程安全问题。  


总结

 加油!!!!

http://www.yidumall.com/news/108807.html

相关文章:

  • 宝鸡免费做网站百度最新版本2022
  • 杭州公司注册代办一般多少钱福州百度推广排名优化
  • 如何更换网站模板seo搜索引擎是什么意思
  • 深圳招聘一般在哪个网站ios微信上的pdf乱码
  • wordpress要多少内存seo关键词怎么填
  • wordpress临时维护百度网站排名seo
  • 网站html地图制作百度如何精准搜索
  • 沈阳工程建设监理咨询淄博网站seo
  • 做cpc不做网站可以吗seo是干啥的
  • 怎么做网站关键词排名百度推广合作
  • 建设银行安徽 招聘网站昆明优化网站公司
  • 做视频网站公司要怎么做的seo站长工具是什么
  • 营销型网站及原因有哪些方面成都新一轮疫情
  • 打码兔怎么和网站做接口关键词排名优化工具有用吗
  • 做网站有自己的服务器爱战网官网
  • 汕头建设有限公司百度seo关键词排名优化工具
  • 建筑网红化网站关键字优化技巧
  • 免费开商城网站吗搭建网站的步骤和顺序
  • 西安 餐饮 网站建设微信怎么做推广
  • 有了域名 怎么做网站无锡网站优化公司
  • 做网站客服维护电话怎么打就在刚刚武汉宣布最新消息
  • 网站开发平台及常用的开发工具人工智能培训
  • 免费网站建设专业服务平台百度指数官网首页
  • 西安网站制作sxyun网站域名查询系统
  • 外贸营销型网站建设平台seo优化裤子关键词
  • 合肥做网站公司哪家好新闻摘抄大全
  • wordpress搬到谷歌服务器对网站的建议和优化
  • 桂林网站制作公司全国疫情最新报告
  • 网站如何链接备案系统百度营销客户端
  • 网站受到攻击西安seo建站