【♨Java基础】谈谈 SimpleDateFormat 的线程安全问题与解决方案
SimpleDateFormat(下面简称sdf)类内部有一个Calendar对象引用,它用来储存和这个sdf相关的日期信息,例如sdf.parse(dateStr), sdf.format(date) 诸如此类的方法参数传入的日期相关String, Date等等, 都是交由Calendar引用来储存的。
这样就会导致一个问题,如果你的sdf是个static的, 那么多个thread 之间就会共享这个sdf, 同时也是共享这个Calendar引用。如果 线程A 调用了 sdf.parse(), 并且进行了 calendar.clear()后还未执行calendar.getTime()的时候,线程B又调用了sdf.parse(), 这时候线程B也执行了sdf.clear()方法, 这样就导致线程A的的calendar数据被清空了(实际上A,B的同时被清空了),又或者当 A 执行了calendar.clear() 后被挂起, 这时候B 开始调用sdf.parse()并顺利结束, 这样 A 的 calendar内存储的的date 变成了后来B设置的calendar的date。
总之一句话,Calendar变量也就是一个共享变量线程不安全。
解决方案
1)注意简单的解决方案就是new一个SimpleDateFormat实例,但是使用这种方法在高并发的情况下会有大量的new sdf以及销毁sdf,这样是非常耗费资源的。
2)使用synchronized同步锁
3)使用TreadLocal
4)使用java8 DateTimeFormatter线程安全对象
分类:
面面俱到
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2022-03-20 Dubbo常用的xml配置
2022-03-20 MyBatis分页插件PageHelper
2022-03-20 源码讲解 —— 接口代理
2022-03-20 源码详解 —— SqlSession
2022-03-20 mybatis的增强工具 —— Mybatis Plus
2022-03-20 辅助mybatis简单表开发的组件 —— 通用Mapper
2022-03-20 源码详解 ——— 核心类SqlSessionFactory