java坑之SimpleDateFormat线程安全问题

举报
object 发表于 2024/02/21 15:51:38 2024/02/21
【摘要】 我们经常会使用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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。