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
  • 并发写入:根据冲突频率选择乐观/悲观锁,确保数据一致性。

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


相关文章
|
3月前
|
JavaScript 算法 数据安全/隐私保护
解决Node.js错误:“error:0308010C:digital envelope routines::unsupported”
在应用上述解决方案前,请确保你的Node.js应用程序的所有依赖都是最新的,这可以通过运行 npm update来实现。同时,始终备份你的工作,以防需要回滚所做的任何更改。通过这些步骤,多数情况下应该能够解决"error:0308010C:digital envelope routines::unsupported"错误问题。这些解决方案能确保应用程序可以顺利运行,同时也为今后可能的OpenSSL库更新做好了准备。
474 16
|
2月前
|
Nacos 微服务
Nacos与Eureka的区别
Eureka与Nacos均支持服务注册发现、健康监测及集群部署,默认采用AP模式保障高可用。区别在于:Nacos心跳间隔更短(5秒),超时剔除更快,支持配置管理与服务变更广播推送,而Eureka仅提供注册中心功能,更新依赖定时任务。
|
消息中间件 存储 负载均衡
2024消息队列“四大天王”:Rabbit、Rocket、Kafka、Pulsar巅峰对决
本文对比了 RabbitMQ、RocketMQ、Kafka 和 Pulsar 四种消息队列系统,涵盖架构、性能、可用性和适用场景。RabbitMQ 以灵活路由和可靠性著称;RocketMQ 支持高可用和顺序消息;Kafka 专为高吞吐量和低延迟设计;Pulsar 提供多租户支持和高可扩展性。性能方面,吞吐量从高到低依次为
5308 1
|
11月前
|
负载均衡 Java 开发者
OpenFeign的工作原理
OpenFeign的工作原理
|
Nacos 微服务
Nacos与Eureka的区别
Eureka和Nacos均支持服务注册发现、基于心跳的健康检查及AP模式下的集群数据同步。主要区别在于:心跳频率、服务剔除机制、服务检测与清理周期不同,Nacos还额外提供配置管理功能。
646 0
|
前端开发
使用Postman导出excel
在本文档中,作者分享了如何使用Postman测试导出Excel接口的两种方法。配以四张图片说明了设置步骤,包括选择接口请求方式、设置Header(Content-Type: multipart/form-data)、Body中选取form-data类型以及指定文件。尽管代码指定了文件名,但在Postman的响应中不会显示,提示需要前端进一步处理。
1967 0
|
消息中间件 资源调度 Kafka
实时计算 Flink版操作报错合集之遇到akka.remote.OversizedPayloadException错误,如何处理
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
SQL DataWorks 关系型数据库
DataWorks操作报错合集之分区表的分区数量已经达到或者超过系统允许的最大值,该如何解决
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。