问题复现
官方说明:simple beautiful strong immutable thread-safe。
1 | public class SimpleDateFormatTest { |
解决方案
方案一
每次创建一个新实例,就没有线程安全问题。不过加重了创建对象的负担,会频繁地创建和销毁对象,效率较低。
1 | public static String formatDate(Date date) throws ParseException { |
方案二
synchronized往上一套也可以解决线程安全问题,缺点自然就是并发量大的时候会对性能有影响,线程阻塞。
1 | private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); |
方案三
ThreadLocal可以确保每个线程都可以得到单独的一个SimpleDateFormat的对象,自然也就不存在竞争问题。
1 | private static ThreadLocal<DateFormat> threadLocal = new ThreadLocal<DateFormat>() { |
方案四
JDK8中,使用Instant代替Date,LocalDateTime代替Calendar,DateTimeFormatter代替SimpleDateFormat,也就是《阿里巴巴开发手册》给我们的解决方案:
1 | public class SimpleDateFormatTest { |