SimpleDateFormat 线程安全与并发更新加锁实践

简介: 在Java开发中,`SimpleDateFormat`非线程安全,禁止声明为`static`。推荐使用`DateTimeFormatter`(JDK8+)、`ThreadLocal`封装或`DateUtils`。并发修改数据时需加锁,低冲突用乐观锁,高冲突用悲观锁,重试不少于3次。保障高并发下系统稳定。


在 Java 开发中,SimpleDateFormat 是线程不安全的。若将其定义为 static 变量,在多线程环境下极易引发解析错误或格式化异常(如 NumberFormatException)。因此,禁止直接将 SimpleDateFormat 声明为 static

安全替代方案有三:

  1. 使用 Apache Commons Lang 的 DateUtils,其内部已处理线程安全;
  2. 通过 ThreadLocal 封装,确保每个线程拥有独立实例:
private static final ThreadLocal<DateFormat> df = ThreadLocal.withInitial(
    () -> new SimpleDateFormat("yyyy-MM-dd")
);
  1. JDK 8+ 推荐使用新的日期时间 API:  
  • LocalDateTime 替代 Calendar,  
  • DateTimeFormatter 替代 SimpleDateFormat
    后者是不可变(immutable)且线程安全的,官方评价其“simple, beautiful, strong, immutable, thread-safe”。

并发修改同一记录需加锁

当多个请求可能同时修改同一条数据时,必须引入并发控制机制,否则会导致数据覆盖或状态错乱。

常见策略包括:

  • 应用层加锁(如 synchronizedReentrantLock);
  • 缓存层加锁(如 Redis 分布式锁);
  • 数据库层使用乐观锁:通过 version 字段控制更新,SQL 示例:
UPDATE table SET value = ?, version = version + 1 
WHERE id = ? AND version = #{oldVersion}

选择建议:  

  • 若冲突概率 < 20%,优先用乐观锁(性能更高);  
  • 否则使用悲观锁(如数据库行锁);  
  • 乐观锁重试次数不应少于 3 次,以应对短暂竞争。

总结

  • 日期格式化:弃用 static SimpleDateFormat,拥抱 DateTimeFormatterThreadLocal
  • 并发写入:根据冲突频率选择乐观/悲观锁,确保数据一致性。

这两点虽小,却是高并发系统稳定性的基石。


相关文章
IDEA 降级gradle插件教程
IDEA 降级gradle插件教程
2273 0
IDEA 降级gradle插件教程
|
2月前
|
XML 人工智能 JSON
为什么你的AI Agent像个傻子?因为你没给它装“Skill”
本文剖析AI Agent“能聊不能干”的困局,指出其核心瓶颈在于缺乏可执行、可复用的“Skill”(能力单元),而非模型本身。文章对比Prompt与Skill本质差异,拆解Skill三层结构,并以登录场景为例展示工程化落地路径,最后给出测试团队可立即实践的三步法:盘点重复操作、规范Skill设计、编写单元测试。
|
缓存 人工智能 自然语言处理
阿里云百炼工作流新版功能介绍
阿里云百炼工作流全新升级,带来十大优化:对话与任务模板合并、UI界面焕新、画布性能提升、布局优化、新增流程输入输出节点、报错机制改进、聚合分组功能、参数提取节点、绘画变量记忆增强、失败重试机制。提升流程设计效率与稳定性,助力开发者高效构建AI应用。
1164 1
|
6月前
|
监控 算法 Unix
Thread.sleep(0) 到底有什么用(读
Thread.Sleep用于让线程暂停执行一段时间,不参与CPU竞争。Sleep(1000)并不保证精确唤醒时间,因系统调度受优先级和资源影响;而Sleep(0)会触发系统立即重新分配CPU,给予其他线程执行机会,避免界面假死,具有实际意义。
|
7月前
|
JavaScript 算法 数据安全/隐私保护
解决Node.js错误:“error:0308010C:digital envelope routines::unsupported”
在应用上述解决方案前,请确保你的Node.js应用程序的所有依赖都是最新的,这可以通过运行 npm update来实现。同时,始终备份你的工作,以防需要回滚所做的任何更改。通过这些步骤,多数情况下应该能够解决"error:0308010C:digital envelope routines::unsupported"错误问题。这些解决方案能确保应用程序可以顺利运行,同时也为今后可能的OpenSSL库更新做好了准备。
945 16
THW
|
6月前
|
存储 安全
BadUSB 攻击原理
BadUSB攻击通过将USB设备伪装成键盘等HID设备,利用系统对HID的信任,在连接电脑后自动模拟键盘输入执行恶意指令,从而绕过传统安全防护,实现无需用户操作的秒级入侵。
THW
652 0
|
6月前
|
Nacos 微服务
Nacos与Eureka的区别
Eureka与Nacos均支持服务注册发现、健康监测及集群部署,默认采用AP模式保障高可用。区别在于:Nacos心跳间隔更短(5秒),超时剔除更快,支持配置管理与服务变更广播推送,而Eureka仅提供注册中心功能,更新依赖定时任务。
|
Java 数据处理
阿里云百炼工作流支持多模型协同标注,三模型投票分类用户意图实战
本文介绍了一种基于多模型协作的高效分类工作流方案,用于解决传统标注工作中人力依赖大、易出错的问题。通过通义千问系列的 Qwen-Plus、Qwen-Max 和 Qwen3-30b-a3b 三大模型,结合投票机制,实现售前售后意图识别的精准分类。文中详细讲解了如何在阿里云百炼应用广场创建任务型工作流,包括模型节点配置、条件判断设置及测试发布全流程。此外,还提供了批量打标的 Java 示例代码,适用于更复杂的意图标注场景。跟随文章步骤,即可快速构建高效率、高准确性的分类系统。
3040 0
|
存储 监控 Java
三万字长文:JVM内存问题排查Cookbook
本文主要系统性地整理了排查思路,为大家遇到问题时提供全面的排查流程,不至于漏掉某些可能性误入歧途浪费时间。