发布时间:2026/7/15 21:17:44
【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/7/15 21:17:44

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

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

2026/7/15 21:17:44

python 连接拓竹打印机

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

2026/7/15 21:17:44

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

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

2026/7/15 22:23:15

Pixhawk留待模式硬件依赖与参数调优实战指南

1. 什么是留待模式?它到底在飞控里干了什么活? “Pixhawk留待模式”这六个字,我第一次在飞控调试现场听到时,手里的遥控器差点没捏稳——不是因为多高深,而是因为它太“像人”了。它不像自稳模式那样只管姿态、不管位置…

2026/7/15 22:23:15

模板驱动型文档自动化:零代码实现结构化PDF/Word批量生成

1. 项目概述:当文档生成变成“填空游戏”你有没有过这种体验:每周要交三份结构雷同但数据不同的项目周报,每份都要手动调整标题层级、更新图表编号、核对页眉页脚、反复检查目录是否自动更新;法务同事发来一份标准服务协议模板&am…

2026/7/15 22:23:15

微信接口开发:高效实现多媒体消息自动推送

在企业自动化办公或各类业务预警系统中,仅仅推送一行纯文本往往是不够的。比如财务报表的 PDF 截图、设备故障的现场照片,或是重要的语音通知,这些多媒体内容往往才是决策的核心信息。 通过微信接口实现多媒体消息的自动化推送,是…

2026/7/15 22:23:15

微信接口接入:如何串起企业的自动化流程?

很多时候,企业的研发团队在处理“微信接口”时,总是陷入一种困境:业务系统、数据库、AI 分析引擎以及各部门的通知需求,彼此像是一座座“孤岛”。每当需要打通一个新的环节,就得写一堆脚本、定时任务或者 Webhook 转发…

2026/7/15 17:04:06

3步解锁音乐自由:ncmdumpGUI终极NCM文件解密转换指南

3步解锁音乐自由:ncmdumpGUI终极NCM文件解密转换指南 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾在网易云音乐下载了心爱的歌曲&#…

2026/7/15 22:21:34

CANoe 19 SP3 配置 GB/T 27930-2023 A类系统:3步搭建BMS仿真测试环境

CANoe 19 SP3 配置 GB/T 27930-2023 A类系统:3步搭建BMS仿真测试环境随着新能源汽车行业的快速发展,充电通信协议的标准化和测试验证变得尤为重要。GB/T 27930-2023作为中国智能充电协议的最新版本,对充电机与电动汽车之间的通信提出了更严格…

2026/7/14 18:30:06

3步搞定RTL8852BE驱动:从零开始配置Wi-Fi 6网卡

3步搞定RTL8852BE驱动:从零开始配置Wi-Fi 6网卡 【免费下载链接】rtl8852be Realtek Linux WLAN Driver for RTL8852BE 项目地址: https://gitcode.com/gh_mirrors/rt/rtl8852be 还在为Linux系统无法识别RTL8852BE Wi-Fi 6网卡而烦恼吗?&#x1f…

2026/7/15 0:08:29

【LINUX】驱动

【LINUX驱动】【字符设备】【中断】【Platform】【网课 设备树】【GPIO】【PINCTRL】【INPUT】【IIC】【SPI】【网络驱动】【屏幕驱动】【一 设备树】【二 内核模块编译】【三 基本驱动框架】【四 Platform总线设备驱动框架】【五 驱动子系统】【六 综合】

2026/7/15 0:08:29

【1982-2026】全国高精度建筑轮廓|村级精度|SHP矢量

🔍 数据简介 本次分享1982-2026年全国村级精度建筑轮廓矢量数据,覆盖全国各省市区县,到村级别精细,为2026年最新实时采集成果,非网传仅60/77个城市的老旧数据。 数据含带高度/不带高度双版本,单体建筑边界精…

2026/7/15 0:08:29

【1975-2026】全国水系水路数据|河流/水库/运河|SHP矢量

🔍 数据简介 本次分享1975-2026年全国高精度水系水路矢量数据,覆盖全国全域,包含河流、水系、水库、运河、湿地、冰川、沟渠等全类别水文要素。 数据集包含双层矢量图层,字段分类清晰、要素齐全,支持2013-2026逐年完整…

2026/7/15 13:36:32

3个高效策略:快速掌握Axure中文界面配置

3个高效策略:快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…