最佳答案
SimpleDateFormat 的 javadoc 指出 SimpleDateFormat 没有同步。
”日期格式不同步 建议创建独立的 格式化每个线程的实例 多线程访问一种格式 同时,它必须是同步的 对外。”
但是在多线程环境中使用 SimpleDateFormat 实例的最佳方法是什么呢。下面是我想到的一些选项,我过去使用过选项1和选项2,但我很好奇是否有更好的选项,或者这些选项中哪一个能提供最佳的性能和并发性。
选项1: 在需要时创建本地实例
public String formatDate(Date d) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.format(d);
}
选项2: 创建 SimpleDateFormat 的实例作为类变量,但同步对它的访问。
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
public String formatDate(Date d) {
synchronized(sdf) {
return sdf.format(d);
}
}
选项3: 创建 ThreadLocal 以为每个线程存储不同的 SimpleDateFormat 实例。
private ThreadLocal<SimpleDateFormat> tl = new ThreadLocal<SimpleDateFormat>();
public String formatDate(Date d) {
SimpleDateFormat sdf = tl.get();
if(sdf == null) {
sdf = new SimpleDateFormat("yyyy-MM-hh");
tl.set(sdf);
}
return sdf.format(d);
}