怀柔高端网站建设,昆山网站建设哪家比较好,关于企业微网站建设方案,开发一套程序多少钱前言
工作或学习过程中难免会接触到时间#xff08;Date#xff09;相关的内容#xff0c;比如String类型转为Date类型#xff0c;或者Date类型转为String类型#xff0c;jdk为我们提供了一套完善的日期格式化工具#xff0c;DateFormat类#xff0c;使用者可以使用该接…前言
工作或学习过程中难免会接触到时间Date相关的内容比如String类型转为Date类型或者Date类型转为String类型jdk为我们提供了一套完善的日期格式化工具DateFormat类使用者可以使用该接口实现常用日期的格式化。但是这里面有个坑…
DateFormat使用
package com.cz.threadLocal;import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;/*** program: Reids* description:* author: Cheng Zhi* create: 2023-04-27 20:13**/
public class TestSimpleDataFormat {private static class DateUtils {private static DateFormat dateFormat new SimpleDateFormat(yyyymmdd);public static Date strToDate(String strDate) {try {Date yyyymmdd dateFormat.parse(strDate);return yyyymmdd;} catch (ParseException e) {e.printStackTrace();}return null;}}public static void main(String[] args) {//System.out.println(DateUtils.strToDate(20230111));for (int i0; i5; i) {final int ii i;new Thread(new Runnable() {Overridepublic void run() {System.out.println(DateUtils.strToDate(2023011 ii));}}).start();}}
}以上就是一个日期转换的测试类但是实际运行起来会报错如下 原因是什么呢一般在多线程环境下要避免出现全局变量因为全局变量会受到多个线程的影响这个类似于mysql存储过程中使用视图做为游标一样因为视图是数据库级的所以多个存储过程一起跑会导致视图中的数据变更。java中也是一样的全局变量会被各个线程去读取或修改。就上面的例子而言这里有多处问题 1、private static DateFormat dateFormat new SimpleDateFormat(“yyyymmdd”); 使用static修饰这个就相当于多个线程会共享所以这里本身就是不安全的。 2、SimpleDateFormat这个类本身就是不安全的如下 该类中使用了全局变量。 CalendarBuilder中存在有一个establish方法在执行该方法时会将全局变量中的内容清除这里使用的是逻辑清除即全部设置为0所以多个线程下如果线程A清除了stamp[]中的内容线程B要使用stamp[]中的内容这里就会产生异常。
因此在多线程中使用DateFormat时要考虑线程安全问题既然说到线程安全那一般就有如下几个方法 1、每次使用new 一个新的对象但是这样效率很低。 2、在使用DateFormat的时候加锁。 3、将DateFormat对象使用ThreadLocal来存储。 修改后的代码如下
package com.cz.threadLocal;import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;/*** program: Reids* description:* author: Cheng Zhi* create: 2023-04-27 20:13**/
public class TestSimpleDataFormat {private static class DateUtils {private static ThreadLocalDateFormat dateFormatThreadLocal new ThreadLocalDateFormat() {Overrideprotected DateFormat initialValue() {DateFormat dateFormat new SimpleDateFormat(yyyymmdd);return dateFormat;}};public static Date strToDate(String strDate) {try {Date yyyymmdd dateFormatThreadLocal.get().parse(strDate);return yyyymmdd;} catch (ParseException e) {e.printStackTrace();}return null;}}public static void main(String[] args) {//System.out.println(DateUtils.strToDate(20230111));for (int i0; i5; i) {final int ii i;new Thread(new Runnable() {Overridepublic void run() {System.out.println(DateUtils.strToDate(2023011 ii));}}).start();}}
}运行效果