1.采用ThreadLocal中新增加的withInitial方法
public class DateFormatSafe {
private static final ThreadLocal<SimpleDateFormat> THREAD_LOCAL = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd"));
public static void main(String[] args) {
Thread threadA = new Thread(() -> process(1998, 0, 2));
Thread threadB = new Thread(() -> process(2022, 9, 24));
threadA.start();
threadB.start();
}
private static void process(int year, int month, int day) {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.MONTH, month);
calendar.set(Calendar.DAY_OF_MONTH, day);
String format = THREAD_LOCAL.get().format(calendar.getTime());
System.out.println(format);
}
}
这样处理以后,每一个线程获得自己的SimpleDateFormat实例。
2.采用新的日期类LocalDate和新的格式化类DateTimeFormatter
public class DateTimeFormatterTest {
private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
public static void main(String[] args) {
Thread threadA = new Thread(() -> System.out.println(LocalDateTime.now().format(DATE_TIME_FORMATTER)));
Thread threadB = new Thread(() -> System.out.println(LocalDateTime.of(2021, 9, 21, 20, 35, 18).format(DATE_TIME_FORMATTER)));
threadA.start();
threadB.start();
}
}
新的日期和格式化类本身就是线程安全的,直接使用即可。