前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >三分钟搞清楚,SimpleDateFormat是线程安全的吗?

三分钟搞清楚,SimpleDateFormat是线程安全的吗?

作者头像
Tom弹架构
发布2023-08-10 09:13:38
7440
发布2023-08-10 09:13:38
举报
文章被收录于专栏:Tom弹架构Tom弹架构

一位工作两年的小伙伴被问到这样一道面试题,说SimpleDateFormat是线程安全的吗?我们每天都在使用SimpleDateFormat这个工具类,屏幕前的你能回答出来吗?

面试官问这个问题的主要目的是希望应聘者能说出解决方案,并不只是回答是或者不是。

今天,我给大家分享一下我对这个问题的理解。

1

原因分析

先说答案,SimpleDateFormat不是线程安全的。

因为,SimpleDateFormat类的内部有一个Calendar对象引用,这个对象主要用来储存和这个SimpleDateFormat相关的日期信息。

当我们把SimpleDateFormat作为多个线程的共享资源来使用的时候,那就意味着多个线程之间会共享这个SimpleDateFormat里面的Calendar引用。如果多个线程同时于操作这个Calendar对象的情况下,就会出现数据脏读的现象,从而导致一些不可预料的错误。

那么,如何保证SimpleDateFormat线程安全呢?

2

解决方案

在实际的开发中,我认为有以下4种方法可以保证SimpleDateFormat线程安全。

1)、可以把SimpleDateFormat定义成非全局使用的局部变量,这样每个线程调用的时候都创建一个新的实例。

2)、可以使用ThreadLocal,把SimpleDateFormat变成一个线程私有的对象。

3)、定义SimpleDateFormat的时候,加上同步锁,这样就能够保证在同一时刻只允许一个线程操作

4)、使用Java 8的新特性,在Java8中引入了一些线程安全的日期操作API,比如LocalDateTimer、DateTimeFormatter 等等。

4

总结

这道题本质上考察的是如何保证一个Java对象的线程安全问题,因为一旦遇到线程安全问题非常严重且也很隐蔽。虽然现在很多框架都在刻意屏幕复杂性,但是多线程的问题总是绕不开的。因此多线程是大多数大厂面试的基本内容。

以上就是对SimpleDateFormat线程安全这个问题的理解。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-06-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Tom弹架构 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 原因分析
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档