【Java踩坑笔记】47_日期时间计算还在用SimpleDateFormat?线程不安全

发布时间:2026/10/31 2:08:21

【Java踩坑笔记】47_日期时间计算还在用SimpleDateFormat?线程不安全 47 | 日期时间计算还在用 SimpleDateFormat线程不安全摘要SimpleDateFormat不是线程安全的多线程共享一个实例会导致数据错乱甚至抛异常。Java 8 用DateTimeFormatter不可变线程安全。一、问题现象// ❌ 多线程共享 SimpleDateFormat数据错乱privatestaticfinalSimpleDateFormatFMTnewSimpleDateFormat(yyyy-MM-dd);publicstaticvoidmain(String[]args){for(inti0;i10;i){newThread(()-{try{System.out.println(FMT.parse(2024-01-01));}catch(Exceptione){e.printStackTrace();// ❌ 多线程下可能抛异常}}).start();}}现象偶尔出现NumberFormatException或解析出错误日期。二、踩坑现场场景Web 项目里共用 SimpleDateFormat// ❌ 错误定义为静态字段多线程共享ComponentpublicclassDateService{privatestaticfinalSimpleDateFormatFMTnewSimpleDateFormat(yyyy-MM-dd HH:mm:ss);publicStringformat(Datedate){returnFMT.format(date);// ❌ 多线程并发结果错乱}}结果并发请求下格式化结果出现错乱日期。三、原理解析3.1 为什么线程不安全SimpleDateFormat内部用Calendar实例做计算而Calendar是可变对象线程 Afmt.format(date1) → 修改内部 calendar 字段 线程 Bfmt.format(date2) → 同时修改同一个 calendar → 数据竞争结果不可预测3.2 三种错误用法对比用法问题静态字段共用❌ 线程不安全每次创建新实例⚠️ 性能差频繁创建对象加synchronized⚠️ 并发性能差四、正确写法4.1 Java 8用DateTimeFormatter推荐// ✅ 不可变线程安全privatestaticfinalDateTimeFormatterFMTDateTimeFormatter.ofPattern(yyyy-MM-dd HH:mm:ss);publicStringformat(LocalDateTimetime){returntime.format(FMT);// ✅ 线程安全}4.2 Java 7-用ThreadLocal缓存// ✅ 每个线程有自己的 SimpleDateFormat 实例privatestaticfinalThreadLocalSimpleDateFormatFMT_HOLDERThreadLocal.withInitial(()-newSimpleDateFormat(yyyy-MM-dd));publicStringformat(Datedate){returnFMT_HOLDER.get().format(date);}4.3 需要 Date ↔ LocalDateTime 互转// ✅ Java 8 互转DatedatenewDate();LocalDateTimetimedate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();LocalDateTimenowLocalDateTime.now();Datedate2Date.from(now.atZone(ZoneId.systemDefault()).toInstant());五、最佳实践✅ 日期时间处理的 4 条铁律Java 8 全面用java.time包LocalDate、LocalDateTime、DateTimeFormatterSimpleDateFormat不是线程安全的不要定义为静态字段老代码迁移Date→InstantCalendar→LocalDateTime**时区处理用ZoneId不要用TimeZone**java.time包的优势类替换优势LocalDateDate只有日期不可变线程安全LocalDateTimeCalendar日期时间不可变DateTimeFormatterSimpleDateFormat不可变线程安全InstantDate时间戳时区无关六、小结SimpleDateFormat不是线程安全的静态共用会数据错乱Java 8 用DateTimeFormatter不可变线程安全老代码用ThreadLocalSimpleDateFormat缓存每个线程的实例java.time包全面替换Date/Calendar不可变且 API 更友好下一篇预告用 Optional 消灭 NPE但别把它当万能药——Optional的设计目的是减少 NPE但滥用反而让代码更难读。
延伸阅读

更多相关文章

2026/10/31 2:07:55

HEAD请求实战指南:从原理到性能优化的深度探索

1. HEAD请求的本质与核心价值第一次听说HEAD请求时,你可能会有这样的疑问:既然已经有了GET请求,为什么还需要一个不返回响应体的请求方法?这就像去餐厅吃饭时,服务员先给你看菜单(HEAD请求)&…

2026/10/31 4:23:01

python 连接拓竹打印机

目录 怎么查看序列号: 连接代码:conn_tool.py 怎么查看序列号: 机器屏幕中:设置,设备和序列号,序列号,里面有序列号 连接代码: conn_tool.py 可以获取打印进度。 import time import bambulabs_api as blclass BambuPrinter:def __init__(self, ip, access_code, se…

2026/10/31 4:22:44

电子元器件实战检测:从基础工具到进阶技巧

1. 电子元器件检测入门:工具准备与基础操作 刚入行那会儿,我最常被问到的就是"这块电路板不工作了,到底哪个元件坏了?"说实话,第一次面对密密麻麻的元器件时,我也是一头雾水。但经过这些年的摸爬…

2026/11/1 0:01:26

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/10/31 23:56:25

综合之自动售货机2.0

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/31 23:56:25

AHT10读取温湿度

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/31 23:56:25

ws2812动态滚动显示图片

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/31 23:56:25

MIPI协议介绍

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/1 0:01:26

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/1 0:01:26

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/1 0:01:26

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑