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在多线程下是线程安全的。

浙公网安备 33010602011771号