首页 > 其他分享 >避坑!SimpleDateFormat不光线程不安全,还有这个隐患

避坑!SimpleDateFormat不光线程不安全,还有这个隐患

时间:2022-09-30 15:26:09浏览次数:97  
标签:java 避坑 SimpleDateFormat parse 程不 ParseException import 多线程

众所周知,SimpleDateFormat是多线程不安全的

下面这段代码通过多线程使用同一个SimpleDateFormat对象的parse方法, 多次执行代码来测试,可以看到会出现两种预想不到的现象----->要么出现不正确的时间解析结果,要么抛出message各异的NumberFormatException异常。 @see>>借助SimpleDateFormat来谈谈java里的多线程不安全

package jstudy.dateformat;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class SimpleDateFormatTest {
    public static void main(String[] args) throws ParseException, InterruptedException {
        ExecutorService threadPool = Executors.newFixedThreadPool(20);
        SimpleDateFormat datetimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String startDate = "2022-01-07 15:40:15";
        for (int i = 0; i < 20; i++) {
            threadPool.execute(() -> {
                for (int j = 0; j < 20; j++) {
                    try {
                        // new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(startDate); //使用局部变量可以避免出现线程不安全
                        System.out.println(datetimeFormat.parse(startDate));
                    } catch (ParseException e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    }
}

 

SimpleDateFormat不光线程不安全,还有这个隐患

如下代码运行结果是什么?

    @Test
    public void test() throws ParseException {
        SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyyMMddHHmmss");//pattern
        System.out.println( simpleDateFormat.parse("2022-09-30 13:53:14"));
    }

 

答案:

Wed Dec 08 21:00:13 CST 2021

 


可见,字符串时间与指定的pattern不匹配,导致出现意外结果。

而我们这次在现网排查问题时,正好是遇到了这个坑。


数据库里的付款记录,竟然存在完成时间比创建时间还早的记录,并且还早了多半年。

 

 

排查原因着实费了几番周折。原来,在三方付款服务商通道对接程序里,在解析付款完成时间时,由于程序员当时的粗心,直接拷贝别的对接程序里的代码,再加上测试没有覆盖到这个case,导致运行了一个月,才发现这个问题。

赶紧加上个必要的代码注释,给“伸手党”式的粗心同学提个醒。

 

标签:java,避坑,SimpleDateFormat,parse,程不,ParseException,import,多线程
From: https://www.cnblogs.com/buguge/p/16744992.html

相关文章

  • 八(二)、常用类之时间 Date、SimpleDateFormat、Calendar、localdate(localdatetime,lo
    一、jdk8之前的常用日期时间API1.System类中的currentTimeMills(); 1@Test2publicvoidtest(){3//时间戳:197000:00:00到当前时间的毫秒数4longt......
  • C++ 避坑指南
    主要预防比赛时抱灵……可以用sizeprogram.exe来查看代码中的静态空间大小,能有效避免\(\text{MLE}\)的发生。在打完代码需要时刻注意题目中是否要开longlong,......
  • 如何优雅转换且避免线程不安全的问题
    一、常见时间格式化方式publicstaticvoidmain(String[]args){Datenow=newDate();//创建一个Date对象,获取当前时间StringstrDateFormat="yyyy-MM......
  • 避坑!MATALB与RTL数据对比
    避坑笔记!例如:如果需要计算一个数据除64。公式 ay=———————————— 256由于除数是2的6次方,因此RTL实现上为了减少资源,肯定不会使用除法器,而是选择右......
  • 使用Python对ES进行操作避坑指南
    目前负责有一个数据迁移的项目,主要涉及Mysql,TiDB,ES等数据的批量迁移。除了功能方面的质量保证之外,还需要考虑到对迁移数据库中大量表的校验,包括数据量,数据正确性(暂定抽样)......
  • 线程不安全能怎么办
    一.volatile:轻量级解决“线程安全”的方案1.作用:禁止指令重排序解决线程可见性的问题,实现原理是当操作完变量之后,强制删除掉线程工作内存中的此变量。注意事项:volatile......
  • ArrayList 为什么线程不安全【转载】
    一、源码分析首先看看这个类所拥有的部分属性字段:1publicclassArrayList<E>extendsAbstractList<E>2implementsList<E>,RandomAccess,Cloneable,java.io.......
  • RN 遍历本地图片地址,及避坑
    自定义的格式如代码中所示:require不能放在标签上ListImage=()=>{letImageDate=[{url:require('../../assets/temporaryAva......
  • 【ElasticSearch】索引生命周期管理(三) 避坑指南
    背景主要是针对在使用索引生命周期的去管理索引的过程中,记录所踩到坑,避免同样的问题再次发生问题1. 索引生命周期中设置各个阶段的市场以及索引rollover的时间......
  • Nginx 安装及启动避坑流程
    系统环境:CentOS8.564位【开始安装】(此步骤引自网络教程)https://www.cnblogs.com/torchstar/p/16027538.html教程比较详细,一步步操作就没问题,不过用上面的教程尝试安装......