java坑之SimpleDateFormat线程安全问题
【摘要】 我们经常会使用simpleDateFormat进行日期的格式转换,便于我们在页面进行数据输出时,符合业务需要的时间格式进行展示。不过SimpleDateFormat本身是具有线程安全问题,当我们加固SimpleDateFormat作为静态变量时,就会导致异常。private static final SimpleDateFormat sdf = new SimpleDateFormat("y...
我们经常会使用simpleDateFormat进行日期的格式转换,便于我们在页面进行数据输出时,符合业务需要的时间格式进行展示。
不过SimpleDateFormat本身是具有线程安全问题,当我们加固SimpleDateFormat作为静态变量时,就会导致异常。
private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public static void main(String[] args) {
ThreadPoolExecutor threadPoolExecutor =
new ThreadPoolExecutor(10, 100, 1, TimeUnit.MINUTES,
new LinkedBlockingDeque<>(1000));
while(true) {
threadPoolExecutor.execute(() -> {
String format = sdf.format(new Date());
try {
Date parseDate = sdf.parse(format);
String format2 = sdf.format(parseDate);
System.out.println(format.equals(format2));
} catch (ParseException e) {
e.printStackTrace();
}
});
}
}
输出结果:
java.lang.NumberFormatException: For input string: ""
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Long.parseLong(Long.java:601)
at java.lang.Long.parseLong(Long.java:631)
at java.text.DigitList.getLong(DigitList.java:195)
at java.text.DecimalFormat.parse(DecimalFormat.java:2084)
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 com.huawei.it.api.controller.WhiteController.lambda$main$1(WhiteController.java:112)
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)
Exception in thread "pool-1-thread-7" Exception in thread "pool-1-thread-3" Exception in thread "pool-1-thread-1" java.lang.NumberFormatException: multiple points
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1890)
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:2089)
原因分析:
1.SimpleDateFormat中存在一个成员变量Calendar
2.parse()函数和format()函数均使用该变量进行保存
3.SimpleDateFormat为静态,则成员变量也静态共享
4.Calendar不存在线程安全机制,线程并发时,SimpleDateFormat存在线程安全问题
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)