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插件教程
2143 0
IDEA 降级gradle插件教程
|
5月前
|
JavaScript 算法 数据安全/隐私保护
解决Node.js错误:“error:0308010C:digital envelope routines::unsupported”
在应用上述解决方案前,请确保你的Node.js应用程序的所有依赖都是最新的,这可以通过运行 npm update来实现。同时,始终备份你的工作,以防需要回滚所做的任何更改。通过这些步骤,多数情况下应该能够解决"error:0308010C:digital envelope routines::unsupported"错误问题。这些解决方案能确保应用程序可以顺利运行,同时也为今后可能的OpenSSL库更新做好了准备。
746 16
THW
|
4月前
|
存储 安全
BadUSB 攻击原理
BadUSB攻击通过将USB设备伪装成键盘等HID设备,利用系统对HID的信任,在连接电脑后自动模拟键盘输入执行恶意指令,从而绕过传统安全防护,实现无需用户操作的秒级入侵。
THW
378 0
|
4月前
|
监控 算法 Unix
Thread.sleep(0) 到底有什么用(读
Thread.Sleep用于让线程暂停执行一段时间,不参与CPU竞争。Sleep(1000)并不保证精确唤醒时间,因系统调度受优先级和资源影响;而Sleep(0)会触发系统立即重新分配CPU,给予其他线程执行机会,避免界面假死,具有实际意义。
|
Java
SpringBoot文件上传单文件多文件上传
SpringBoot文件上传单文件多文件上传
216 0
|
4月前
|
Nacos 微服务
Nacos与Eureka的区别
Eureka与Nacos均支持服务注册发现、健康监测及集群部署,默认采用AP模式保障高可用。区别在于:Nacos心跳间隔更短(5秒),超时剔除更快,支持配置管理与服务变更广播推送,而Eureka仅提供注册中心功能,更新依赖定时任务。
|
存储 监控 Java
三万字长文:JVM内存问题排查Cookbook
本文主要系统性地整理了排查思路,为大家遇到问题时提供全面的排查流程,不至于漏掉某些可能性误入歧途浪费时间。
|
消息中间件 存储 负载均衡
2024消息队列“四大天王”:Rabbit、Rocket、Kafka、Pulsar巅峰对决
本文对比了 RabbitMQ、RocketMQ、Kafka 和 Pulsar 四种消息队列系统,涵盖架构、性能、可用性和适用场景。RabbitMQ 以灵活路由和可靠性著称;RocketMQ 支持高可用和顺序消息;Kafka 专为高吞吐量和低延迟设计;Pulsar 提供多租户支持和高可扩展性。性能方面,吞吐量从高到低依次为
6296 1

热门文章

最新文章