SimpleDateFormat 为什么线程不安全
SimpleDateFormat是线程不安全的主要原因如下1.内部状态可变性// SimpleDateFormat 内部维护了可变状态 private StringBuffer format(Date date, StringBuffer toAppendTo, FieldDelegate delegate) { // 会修改内部的 Calendar 对象 calendar.setTime(date); // ... }2.共享的 Calendar 实例每个SimpleDateFormat对象内部都持有一个Calendar实例public class SimpleDateFormat extends DateFormat { protected Calendar calendar; // 共享的可变状态 public String format(Date date) { // 1. 设置时间到 calendar calendar.setTime(date); // 2. 使用 calendar 进行格式化 return format(calendar); } }3.并发问题场景情况1多线程同时调用 format()SimpleDateFormat sdf new SimpleDateFormat(yyyy-MM-dd); // 线程A sdf.format(dateA); // 设置 calendar 为 dateA // 线程B在此刻插入 sdf.format(dateB); // 设置 calendar 为 dateB // 线程A继续格式化但calendar已经被线程B修改情况2多线程同时调用 parse()// 线程A sdf.parse(2024-01-01); // 线程B sdf.parse(2024-02-01); // 两者可能互相干扰得到错误结果4.问题复现代码SimpleDateFormat sdf new SimpleDateFormat(yyyy-MM-dd HH:mm:ss); ExecutorService executor Executors.newFixedThreadPool(10); ListFutureString futures new ArrayList(); for (int i 0; i 10; i) { final int index i; futures.add(executor.submit(() - { Date date new Date(System.currentTimeMillis() index * 1000); return sdf.format(date); // 可能出现空指针、格式错误、时间错乱 })); }5.线程安全的替代方案方案1使用 ThreadLocal推荐private static final ThreadLocalSimpleDateFormat threadLocal ThreadLocal.withInitial(() - new SimpleDateFormat(yyyy-MM-dd)); public String formatDate(Date date) { return threadLocal.get().format(date); }方案2每次创建新实例public String formatDate(Date date) { return new SimpleDateFormat(yyyy-MM-dd).format(date); } // 缺点频繁创建对象性能较差方案3使用 DateTimeFormatterJava 8// DateTimeFormatter 是线程安全的 DateTimeFormatter formatter DateTimeFormatter.ofPattern(yyyy-MM-dd HH:mm:ss); // 格式化 String formatted LocalDateTime.now().format(formatter); // 解析 LocalDateTime parsed LocalDateTime.parse(2024-01-26 10:30:00, formatter);方案4使用 FastDateFormatApache Commons LangFastDateFormat formatter FastDateFormat.getInstance(yyyy-MM-dd); String formatted formatter.format(new Date()); // 线程安全6.为什么 DateTimeFormatter 线程安全public final class DateTimeFormatter { // 所有字段都是 final 的 private final CompositePrinter printer; private final CompositeParser parser; private final Locale locale; // 所有方法都是纯函数不修改内部状态 public String format(TemporalAccessor temporal) { // 不修改任何实例变量 } }总结根本原因SimpleDateFormat内部可变状态Calendar在多线程下被共享修改解决方案使用ThreadLocal包装适合传统项目使用 Java 8 的DateTimeFormatter推荐新项目使用同步锁性能差不推荐在并发环境下永远不要共享同一个SimpleDateFormat实例。

相关新闻

java Date转换为string

java Date转换为string

在Java中将Date转换为String有多种方法,以下是常用的几种方式: 1. 使用 SimpleDateFormat(传统方式,Java 8之前) import java.text.SimpleDateFormat; import java.util.Date;// 创建Date对象 Date date new Date()…

2026/7/6 10:24:05 阅读更多 →
设计模式在 TypeScript 中的实现

设计模式在 TypeScript 中的实现

设计模式在 TypeScript 中的实现 欢迎继续本专栏的第三十八篇文章。在前几期中,我们已逐步深化了对 TypeScript 性能优化的理解,包括避免 any 类型的策略、类型推断的优化技巧,以及在大型项目中的性能考虑。这些实践帮助我们构建了更高效和可…

2026/7/5 22:52:34 阅读更多 →
性能优化:类型系统的最佳实践

性能优化:类型系统的最佳实践

性能优化:类型系统的最佳实践 欢迎继续本专栏的第三十七篇文章。在前几期中,我们已逐步深化了对 TypeScript 测试实践的理解,包括如何配置 Jest 以支持类型安全的断言和 mock,以及在异步代码中的错误处理策略。这些内容帮助我们构…

2026/7/3 18:37:04 阅读更多 →

最新新闻

别再死磕提示词了!2026年,做小红书图文带货,聪明人都在用这套“商品工作流

别再死磕提示词了!2026年,做小红书图文带货,聪明人都在用这套“商品工作流

最近跟几个做小红书图文带货的朋友聊天,大家普遍有一种很深的无力感。不是因为不够努力,相反,大家都很拼。天天在各种群里收藏最新的 AI 提示词,追着各种新工具跑,甚至连最近流行的“循环工程”都去研究了一遍。但回到…

2026/7/7 4:25:44 阅读更多 →
RT-Thread 内核对象管理机制剖析:从 rt_object 结构体看设计模式在 RTOS 中的落地

RT-Thread 内核对象管理机制剖析:从 rt_object 结构体看设计模式在 RTOS 中的落地

RT-Thread 内核对象管理机制剖析:从 rt_object 结构体看设计模式在 RTOS 中的落地 一、当内核对象的数据结构成为架构瓶颈 在 RTOS 的开发中,线程、信号量、互斥量、消息队列、定时器等内核对象是构建并发应用的基础。不同的 RTOS 对这些对象的管理方式差…

2026/7/7 4:21:43 阅读更多 →
数据中心存储系统故障了?怎么办!

数据中心存储系统故障了?怎么办!

存储系统是大数据与云计算的基础,其稳定性至关重要。以下是针对存储系统故障处置的简要思路总结。前置准备 处理故障前,需深入理解存储系统的架构与原理。典型存储系统由主机、交换机和存储设备组成,通过直连、IP网络或FC网络互联&#xff0c…

2026/7/7 4:19:42 阅读更多 →
ATT专利开放催生硅谷,AI时代公有智慧私有攫取引发法律与伦理争议!

ATT专利开放催生硅谷,AI时代公有智慧私有攫取引发法律与伦理争议!

公有智慧的私有攫取1956年1月24日,美国电话电报公司(AT&T)作为当时全球最大私营公司,营收占美国GDP近2%,有74.6万员工。旗下贝尔实验室成就卓越,为科学家赢得五项图灵奖和十项诺贝尔奖。当天AT&T签…

2026/7/7 4:17:42 阅读更多 →
用国标GB28181视频平台EasyGBS搭建森林防火AI哨兵

用国标GB28181视频平台EasyGBS搭建森林防火AI哨兵

每年3–6 月、9–11月都是森林防火的关键期。视频监控AI 识别,正在成为边远林区、空旷工地的标配。本文以EasyGBS算法算力云平台 为底座,给出一套可落地的"森林防火AI哨兵"搭建路径。一、为什么"传统监控"在林区不好用?在…

2026/7/7 4:17:42 阅读更多 →
2026高性价比数字人平台怎么选?从预算、口型、批量出片到商用权限一次讲清(CSDN投稿优化版)

2026高性价比数字人平台怎么选?从预算、口型、批量出片到商用权限一次讲清(CSDN投稿优化版)

2026高性价比数字人平台怎么选?从预算、口型、批量出片到商用权限一次讲清(CSDN投稿优化版) 很多人在选数字人平台时,第一反应是先看价格:哪个更便宜、哪个试用门槛更低、哪个看起来“最划算”。但真正进入使用阶段以后…

2026/7/7 4:11:39 阅读更多 →

日新闻

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

图片浏览是移动应用中最高频的场景之一。从社交应用的照片流到电商平台的商品图集,从旅游应用的景点相册到摄影作品展示——用户对图片浏览的体验要求不断提高:流畅的切换动画、直观的缩略图导航、便捷的收藏操作、自动播放模式。HarmonyOS NEXT ArkUI 虽…

2026/7/7 0:05:16 阅读更多 →
24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V稳压芯片完整选型指南 PW8600 PW75XX PW2815 PW2312B LDODC/DC全方案 一、24V稳压方案概述 24V直流电源在工业自动化、门禁系统、电梯控制、汽车电子、LED驱动、监控设备等场景中应用极广,是最常见的中压直流母线电压。要将24V母线稳定降压至下游MCU、传感器…

2026/7/7 0:05:16 阅读更多 →
RAG+知识图谱混合检索与Graph RAG核心对比

RAG+知识图谱混合检索与Graph RAG核心对比

做企业RAG落地的团队,往往容易卡在一容易踩坑的选型难题: 当需求单纯靠向量RAG搞不定、单纯靠知识图谱也搞不定,必须同时依赖「文本语义理解 实体关系推理」时,到底是做「向量图谱混合检索」就够了,还是必须上「Grap…

2026/7/7 0:07:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻