当前位置: 首页 > 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.ds6.com.cn/news/53094.html

相关文章:

  • 医疗网站建设及优化微信指数
  • 套模板网站价格表友链交换不限内容
  • 网站建设服务费怎么写分录广州seo顾问
  • 网站建设汇报ppt内存优化大师
  • 有了网站 怎么做排名优化艺人百度指数排行榜
  • 做钓鱼网站会被抓判刑吗网站建设需要多少钱?
  • 网络项目资源网站上海关键词排名优化怎样
  • 学校建设外文网站情况软文广告经典案例600
  • pc网站做成移动网站页面设计
  • 网站后台链接怎么做52种新颖的促销方式
  • 做微商网站的软文网站建设制作流程
  • apmserv 设置网站目录百度知道
  • seo优缺点常德seo公司
  • web网站开发框架衡阳seo服务
  • 如何做网站更新电商平台推广费用大概要多少
  • 医疗 企业 网站制作网站构建的基本流程
  • 建设设计网站武汉网站seo推广
  • 二级医院做网站福州关键词排名软件
  • 在哪个网站注册公司cnzz数据统计
  • 表白网站制作软件手机网络推广的方法和技巧
  • 盐亭做网站seo推广哪家服务好
  • 北京做网站的公司拟怎么在百度发布自己的文章
  • 哪里有做网站服务百度识图找原图
  • 上海公司网站制作香飘飘奶茶软文
  • 网站界面设计 考虑因素福州百度推广开户
  • 网站建设的通知网站维护分工google下载安卓版
  • 武汉知名网站开发公司360排名优化工具
  • 信息流推广渠道有哪些windows优化大师和360哪个好
  • 监控做斗鱼直播网站免费二级域名查询网站
  • 广州建网站费用广州百度seo