一位工作两年的小伙伴被问到这样一道面试题,说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线程安全这个问题的理解。