Index: forgon-tools/src/main/java/com/forgon/tools/util/ForgonDateUtils.java =================================================================== diff -u -r38140 -r41191 --- forgon-tools/src/main/java/com/forgon/tools/util/ForgonDateUtils.java (.../ForgonDateUtils.java) (revision 38140) +++ forgon-tools/src/main/java/com/forgon/tools/util/ForgonDateUtils.java (.../ForgonDateUtils.java) (revision 41191) @@ -24,19 +24,30 @@ */ public class ForgonDateUtils { + public static final String DATE_FORMAT_YYYYMMDDHHMMSS = "yyyy-MM-dd HH:mm:ss"; + public static final String DATE_FORMAT_YYYYMMDDHHMM = "yyyy-MM-dd HH:mm"; + public static final String DATE_FORMAT_YYYYMMDD = "yyyy-MM-dd"; + public static final String DATE_FORMAT_YYYYMM = "yyyy-MM"; + public static final String DATE_FORMAT_YYYY = "yyyy"; /** * 这里由于项目依赖关系,重新定义了一份,跟com.forgon.Constants中的定义是一样的 + * @deprecated SimpleDateFormat不是线程安全的.应该使用线程局部变量或者使用java8的java.time包 */ + @Deprecated public final static SimpleDateFormat SIMPLEDATEFORMAT_YYYYMMDDHHMMSS = new SimpleDateFormat( - "yyyy-MM-dd HH:mm:ss"); + DATE_FORMAT_YYYYMMDDHHMMSS); + @Deprecated public final static SimpleDateFormat SIMPLEDATEFORMAT_YYYYMMDDHHMM = new SimpleDateFormat( - "yyyy-MM-dd HH:mm"); + DATE_FORMAT_YYYYMMDDHHMM); + @Deprecated public final static SimpleDateFormat SIMPLEDATEFORMAT_YYYYMMDD = new SimpleDateFormat( - "yyyy-MM-dd"); + DATE_FORMAT_YYYYMMDD); + @Deprecated public final static SimpleDateFormat SIMPLEDATEFORMAT_YYYYMM = new SimpleDateFormat( - "yyyy-MM"); + DATE_FORMAT_YYYYMM); + @Deprecated public final static SimpleDateFormat SIMPLEDATEFORMAT_YYYY = new SimpleDateFormat( - "yyyy"); + DATE_FORMAT_YYYY); /** * 根据给定的时间格式,把String型转成Date类型,若转换成不成功则返回null.. @@ -75,7 +86,9 @@ * 尝试用最大精度的日期格式转换,从有秒=》分=》时=》日=》月=》年,如果都没有尝试转换成功,返回当前时间 * @param dateStr * @return + * @deprecated SimpleDateFormat不是线程安全的.应该使用线程局部变量或者使用java8的java.time包 */ + @Deprecated public static Date safelyParseDate(String dateStr){ Date date = safelyParseDate(dateStr,SIMPLEDATEFORMAT_YYYYMMDDHHMMSS); if(date == null){ Index: forgon-tools/src/test/java/com/forgon/tools/util/SimpleDateFormatThreadUnsafeTest.java =================================================================== diff -u --- forgon-tools/src/test/java/com/forgon/tools/util/SimpleDateFormatThreadUnsafeTest.java (revision 0) +++ forgon-tools/src/test/java/com/forgon/tools/util/SimpleDateFormatThreadUnsafeTest.java (revision 41191) @@ -0,0 +1,34 @@ +package com.forgon.tools.util; + +import org.junit.Test; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; + +public class SimpleDateFormatThreadUnsafeTest { + private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + @Test + public void testThreadSafety() throws InterruptedException { + ExecutorService executor = Executors.newFixedThreadPool(10); + + for (int i = 0; i < 10; i++) { + final int index = i; + executor.submit(() -> { + try { + // 多线程同时使用同一个 SimpleDateFormat 实例 + Date date = sdf.parse("2024-01-" + (index + 1)); + System.out.println(Thread.currentThread().getName() + ": " + date); + } catch (Exception e) { + System.err.println(Thread.currentThread().getName() + " 出错: " + e.getMessage()); + } + }); + } + + executor.shutdown(); + executor.awaitTermination(1, TimeUnit.MINUTES); + } +}