SimpleDateFormat与DateTimeFormatter多线程下测试

SimpleDateFormat不加锁:

public class DateTimeFormatterSyc {
private static DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyyMMdd");
private static DateTimeFormatter dateTimeFormatter2 = DateTimeFormatter.ofPattern("yyyy-MM-dd");

private static  SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
private static SimpleDateFormat simpleDateFormat2 = new SimpleDateFormat("yyyyMMdd");

private static Object obj = new Object();
public static void main(String[] args) throws InterruptedException {
    String str = "20210226";
    String str2 = "2021-02-26";
    CountDownLatch count = new CountDownLatch(1000);
    Runnable r = ()->{
        String format = LocalDate.parse(str, dateTimeFormatter1).format(dateTimeFormatter2);
        String format2 = LocalDate.parse(str2, dateTimeFormatter2).format(dateTimeFormatter1);
        System.out.println("DateTimeFormatter format:"+format+" format2"+format2);
        count.countDown();
    };
    Runnable r2 = ()->{
        try {

// synchronized (obj) {
System.out.println("simpleDateFormat:"+simpleDateFormat2.format(simpleDateFormat.parse(str2)));
System.out.println("simpleDateFormat:"+simpleDateFormat.format(simpleDateFormat2.parse(str)));
// }
} catch (Exception e) {
e.printStackTrace();
}
finally {
count.countDown();
}
};
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(10,10,1000L, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<>(1000));
for(int i = 0; i < 500; i++) {
threadPoolExecutor.execute(r);
threadPoolExecutor.execute(r2);
}
threadPoolExecutor.shutdown();
count.await();
}
}
出现异常:
java.lang.NumberFormatException: For input string: ".2002211E"
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2043)
at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
at java.lang.Double.parseDouble(Double.java:538)
at java.text.DigitList.getDouble(DigitList.java:169)
at java.text.DecimalFormat.parse(DecimalFormat.java:2056)
at java.text.SimpleDateFormat.subParse(SimpleDateFormat.java:1869)
at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1514)
at java.text.DateFormat.parse(DateFormat.java:364)
at www.rdf.com.cn.java8.DateTimeFormatterSyc.lambda$main$1(DateTimeFormatterSyc.java:43)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
java.lang.NumberFormatException: empty String
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1842)
at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
at java.lang.Double.parseDouble(Double.java:538)
at java.text.DigitList.getDouble(DigitList.java:169)
at java.text.DecimalFormat.parse(DecimalFormat.java:2056)
at java.text.SimpleDateFormat.subParse(SimpleDateFormat.java:2162)
at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1514)
at java.text.DateFormat.parse(DateFormat.java:364)
at www.rdf.com.cn.java8.DateTimeFormatterSyc.lambda$main$1(DateTimeFormatterSyc.java:43)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)

SimpleDateFormat加锁:
public class DateTimeFormatterSyc {

private static DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyyMMdd");
private static DateTimeFormatter dateTimeFormatter2 = DateTimeFormatter.ofPattern("yyyy-MM-dd");

private static  SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
private static SimpleDateFormat simpleDateFormat2 = new SimpleDateFormat("yyyyMMdd");

private static Object obj = new Object();
public static void main(String[] args) throws InterruptedException {
    String str = "20210226";
    String str2 = "2021-02-26";
    CountDownLatch count = new CountDownLatch(1000);
    Runnable r = ()->{
        String format = LocalDate.parse(str, dateTimeFormatter1).format(dateTimeFormatter2);
        String format2 = LocalDate.parse(str2, dateTimeFormatter2).format(dateTimeFormatter1);
        System.out.println("DateTimeFormatter format:"+format+" format2"+format2);
        count.countDown();
    };
    Runnable r2 = ()->{
        try {
            synchronized (obj) {
                System.out.println("simpleDateFormat:"+simpleDateFormat2.format(simpleDateFormat.parse(str2)));
                System.out.println("simpleDateFormat:"+simpleDateFormat.format(simpleDateFormat2.parse(str)));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        finally {
            count.countDown();
        }
    };
    ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(10,10,1000L, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<>(1000));
    for(int i = 0; i < 500; i++) {
        threadPoolExecutor.execute(r);
        threadPoolExecutor.execute(r2);
    }
    threadPoolExecutor.shutdown();
    count.await();
}

}
无异常产生。
DateTimeFormatter在多线程下是线程安全的。

posted @ 2021-03-01 11:14  CoderRdf  阅读(240)  评论(0)    收藏  举报