目录
问题解答
SimpleDateFormat不是线程安全的,SimpleDateFormat类内部有一个Calendar对象引用,它用来储存和这个SimpleDateFormat相关的日期信息。
当我们把SimpleDateFormat作为多个线程的共享资源来使用的时候。
意味着多个线程会共享SimpleDateFormat里面的Calendar引用,多个线程对于同一个Calendar的操作,会出现数据脏读现象导致一些不可预料的错误。在实际应用中,有4种方法可以解决这个问题:
第一种,把SimpleDateFormat定义成局部变量,每个线程调用的时候都创建一个新的实例。
第二种,使用ThreadLocal工具,把SimpleDateFormat变成线程私有的
第三种,加同步锁,在同一时刻只允许一个线程操作SimpleDateFormat
第四种,在Java8里面引入了一些线程安全的日期API,比如LocalDateTimer、DateTimeFormatter等。
面试点评
线程安全是一个非常严重且隐秘的问题。
虽然现在很多框架都在刻意屏幕复杂性,但是多线程的问题总是绕不开的。
因此多线程是大厂最基本的考察内容。