SimpleDateFormat 是线程不安全的类,通常不要定义为 static 变量,若是定义为static,必须加锁,或者使用 DateUtils 工具类。安全
解决方法ide
一、将SimpleDateFormat定义成局部变量。工具
缺点:每调用一次方法就会建立一个SimpleDateFormat对象,方法结束又要做为垃圾回收。性能
二、方法加同步锁synchronized,在同一时刻,只有一个线程能够执行类中的某个方法。spa
缺点:性能较差,每次都要等待锁释放后其余线程才能进入。线程
三、使用第三方库joda-time,由第三方考虑线程不安全的问题。(能够使用)code
四、使用ThreadLocal:每一个线程拥有本身的SimpleDateFormat对象。(推荐使用)orm
正例:注意线程安全,使用 DateUtils。亦推荐以下处理:对象
private static final ThreadLocal<DateFormat> df = new ThreadLocal<DateFormat>() { @Override protected DateFormat initialValue() { return new SimpleDateFormat("yyyy-MM-dd"); } };
说明:若是是 JDK8 的应用,能够使用 Instant 代替 Date,LocalDateTime 代替 Calendar,DateTimeFormatter 代替 SimpleDateFormat,官方给出的解释:simple beautiful strongimmutable thread-safe。
同步