“SimpleDateFormat 是线程安全的吗? 为什么?”
这是一个针对1~3年的Java开发经验的面试题,你能回答出来吗?
这个问题的高手回答我整理到了15W字的面试文档里面大家可以扫描文章尾端二维码领取
下面看看高手的回答
需要高手面试文档面试文档的小伙伴可以扫描文章底部二维码
SimpleDateFormat不是线程安全的,SimpleDateFormat类内部有一个Calendar对象引用,它用来储存和这个SimpleDateFormat相关的日期信息。
当我们把SimpleDateFormat作为多个线程的共享资源来使用的时候。
意味着多个线程会共享SimpleDateFormat里面的Calendar引用,多个线程对于同一个Calendar的操作,会出现数据脏读现象导致一些不可预料的错误。
在实际应用中,我认为有4种方法可以解决这个问题。
第一种,把SimpleDateFormat定义成局部变量,每个线程调用的时候都创建一个新的实例。
第二种,使用ThreadLocal工具,把SimpleDateFormat变成线程私有的
第三种,加同步锁,在同一时刻只允许一个线程操作SimpleDateFormat
第四种,在Java8里面引入了一些线程安全的日期API,比如LocalDateTimer、DateTimeFormatter 等。
线程安全是一个非常严重且隐秘的问题。
虽然现在很多框架都在刻意屏幕复杂性,但是多线程的问题总是绕不开的。
因此多线程是大厂最基本的考察内容。
另外,我将所有Java面试系列制作成了完整的面试文档。它的便捷之处在于,可以通过检索的方式,找到你想要的面试题,目前已经更新180期,总计超过15W字!