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

打印 上一主题 下一主题

主题 1040|帖子 1040|积分 3120

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

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

下面这段代码通过多线程使用同一个SimpleDateFormat对象的parse方法, 多次执行代码来测试,可以看到会出现两种预想不到的现象----->要么出现不正确的时间解析结果,要么抛出message各异的NumberFormatException异常。 @see>>借助SimpleDateFormat来谈谈java里的多线程不安全
  1. package jstudy.dateformat;
  2. import java.text.ParseException;
  3. import java.text.SimpleDateFormat;
  4. import java.util.concurrent.ExecutorService;
  5. import java.util.concurrent.Executors;
  6. public class SimpleDateFormatTest {
  7.     public static void main(String[] args) throws ParseException, InterruptedException {
  8.         ExecutorService threadPool = Executors.newFixedThreadPool(20);
  9.         SimpleDateFormat datetimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  10.         String startDate = "2022-01-07 15:40:15";
  11.         for (int i = 0; i < 20; i++) {
  12.             threadPool.execute(() -> {
  13.                 for (int j = 0; j < 20; j++) {
  14.                     try {
  15.                         // new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(startDate); //使用<strong>局部变量</strong>可以避免出现线程不安全
  16.                         System.out.println(datetimeFormat.parse(startDate));
  17.                     } catch (ParseException e) {
  18.                         e.printStackTrace();
  19.                     }
  20.                 }
  21.             });
  22.         }
  23.     }
  24. }
复制代码
 
SimpleDateFormat不光线程不安全,还有这个隐患

如下代码运行结果是什么?
  1.     @Test
  2.     public void test() throws ParseException {
  3.         SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyyMMddHHmmss");//pattern
  4.         System.out.println( simpleDateFormat.parse("2022-09-30 13:53:14"));
  5.     }
复制代码
 
答案:
  1. Wed Dec 08 21:00:13 CST 2021
复制代码
 

可见,字符串时间与指定的pattern不匹配,导致出现意外结果。
而我们这次在现网排查问题时,正好是遇到了这个坑。


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

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

 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

莫张周刘王

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表