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但滥用反而让代码更难读。
HEAD请求实战指南:从原理到性能优化的深度探索 1. HEAD请求的本质与核心价值第一次听说HEAD请求时,你可能会有这样的疑问:既然已经有了GET请求,为什么还需要一个不返回响应体的请求方法?这就像去餐厅吃饭时,服务员先给你看菜单(HEAD请求)&…
python 连接拓竹打印机 目录 怎么查看序列号: 连接代码:conn_tool.py 怎么查看序列号: 机器屏幕中:设置,设备和序列号,序列号,里面有序列号 连接代码: conn_tool.py 可以获取打印进度。 import time import bambulabs_api as blclass BambuPrinter:def __init__(self, ip, access_code, se…
五强竞逐:2026年制造业本地化部署CRM厂商深度对比 在数据安全法与个人信息保护法深度落实的背景下,私有化部署(本地化部署)因其卓越的安全合规性正成为越来越多制造企业的首选。制造业销售周期长、决策链条复杂、多部门协同要求高,对CRM系统的行业适配深度提出了更高要求。本文选取…
C++ 条件语句中结构化绑定落地:让解构与条件检查并列书写,告别冗余的临时变量声明 1. C条件语句中结构化绑定落地:让解构与条件检查并列书写,告别冗余的临时变量声明结构化绑定是 C17 引入的语法糖,允许将 std::pair、std::tuple、数组或聚合体一次解构为多个具名变量。但很多开发者仍然习惯先声明临时变量,再将其…
C#编写的WinForms人事管理系统源码(含SQL Server数据库脚本与完整界面) 本文还有配套的精品资源,点击获取 简介:这是一套开箱即用的Windows桌面人事管理程序,用C#开发,基于WinForms框架,搭配SQL Server数据库。系统支持员工信息录入与维护、部门结构管理、培训记录登记与多条件查询、福利…
AI 指标异常根因分析:多维度关联比人工穷举快在哪 AI 指标异常根因分析:多维度关联比人工穷举快在哪 一、为什么人工排查指标异常总是这么慢 大家好,我是朱大喜。数据团队最怕听到的三句话:第一,"数据不准";第二,"帮我查下为什么"&am…
Python asyncio 数据爬取:并发 100 个请求的正确姿势 Python asyncio 数据爬取:并发 100 个请求的正确姿势 一、为什么多线程在爬虫场景里不够用 大家好,我是朱大喜。作为数据分析师,免不了要写爬虫抓数据——竞品价格、公开财报、行业资讯,这些事情在数据组里都是家常便饭。 很多同学…
AI 数据质量闭环:从发现问题到自动修复的端到端方案 AI 数据质量闭环:从发现问题到自动修复的端到端方案 一、数据质量这件事,传统做法有多低效 大家好,我是朱大喜。如果你做过数据仓库相关的工作,一定对这样的场景不陌生:业务方跑过来跟你说"这个指标不对啊"&…
Rust深度学习绑定:安全接入PyTorch与ONNX的工程实践 1. 项目概述:当 Rust 遇上深度学习,不是“能不能”,而是“怎么稳”“Rustic Learning: Machine Learning in Rust — Part 3: Deep Learning Bindings”这个标题一出来,我就知道这绝不是又一篇泛泛而谈的“Rust 很快所以适合 AI”…
Python ctypes性能优化实战:8大技巧突破C扩展速度瓶颈 1. 项目概述:当Python遇上C,速度瓶颈的破局之道“Python调用C太慢?”——这恐怕是很多在性能敏感场景下使用Python的开发者,尤其是那些尝试过用ctypes、CFFI或Cython来集成C/C代码的朋友,心中挥之不去的疑问。你兴冲冲…
2026 年宜春诚信的塑料缠绕膜厂家哪个好,缠绕膜背后的秘密:你不知道的成本陷阱 - 领域鉴赏官 缠绕膜的秘密是什么,其中的成本陷阱又是怎样的一种情况呢在我们日常生活中的生产、仓储、运输等行业里经常要使用到塑料缠绕膜。你经营的是一个小小的电子产品制造公司,每天有无数电子产品的出货要装箱发货。你依旧用…
TPS2551-Q1负载开关:汽车电子电源路径保护与智能管理实战 1. 项目概述与核心价值在车载电子、便携设备乃至工业控制系统的电源路径设计中,我们工程师最头疼的问题之一,就是如何优雅且可靠地处理“意外”。你精心设计的5V电源轨,可能因为一个劣质USB设备的插入、一根内部短路的线缆,或者仅…
PlantUML 实战:5分钟将 UML 2.5 序列图转换为可执行代码草图 PlantUML 实战:5分钟将 UML 2.5 序列图转换为可执行代码草图 在软件开发过程中,清晰的系统设计往往比编码本身更为关键。传统拖拽式UML工具虽然直观,却常常成为效率杀手——频繁的鼠标操作打断设计思路,版本控制困难,…
【RT-DETR涨点改进】29 动态Batch推理:让RT-DETR在低延迟下吃满GPU算力 29 动态Batch推理:让RT-DETR在低延迟下吃满GPU算力 开篇故事 上个月帮一家安防厂商做项目优化,他们用RT-DETR做实时人流统计,部署在NVIDIA A10上。客户反馈说:“GPU利用率才30%,但延迟已经飙到40ms了,加人流量就丢帧。” 我远程一看,好家伙——生产环境里每个请求单独…
Postman 环境变量实战:3种动态设置方法与CI/CD集成避坑指南 Postman 环境变量高阶实战:动态管理与 CI/CD 深度集成在接口自动化测试领域,环境变量的灵活运用往往成为区分初级与高级测试工程师的关键能力。本文将深入探讨 Postman 环境变量的三种动态设置模式,并分享 Newman 在 CI/CD 流水线中的实战避坑…
[C++]内存管理:串顺序存储的内存回收 在串(字符串)的顺序存储中,内存回收的方式取决于字符串的存储方式以及所使用的编程语言和相关库。以下以 C 为例进行说明,因为 C 对内存管理有较为直接的控制。 1. 基于 char 数组的串顺序存储 如果使用普通的 char 数组来存储字…
移动端游戏功耗测试实战:电流、功率、亮度和场景对比 移动端游戏功耗测试:先控制变量,再比较优化是否真的省电 摘要:功耗测试最容易犯的错误,是拿两次不同温度、不同亮度、不同场景的平均功率直接比较。本文给出一套可复现的游戏功耗测试方法,覆盖引擎特性验证、版本回归和黑盒体验测试,并说明如何把功耗与帧率、温控、CPU/G…
足球口袋教练 HarmonyOS 离线应用实战(03/20):ArkUI 首页仪表盘搭建 本文是“足球口袋教练 HarmonyOS 离线应用实战”系列第 3 篇。示例项目是一个 HarmonyOS / ArkTS / ArkUI 编写的离线足球训练助手,围绕真实页面、真实截图和可复现操作展开。 本篇要解决的问题 训练 App 的首页不能只展示欢迎语,它要解决“我现在该点哪…