【发布时间】:2017-12-07 13:25:37
【问题描述】:
您能否告诉我以下代码是否是线程安全的以及如何测试它:
private static final SimpleDateFormat sdf = new SimpleDateFormat("MMddHHmmss");
Calendar cal = new GregorianCalendar();
TimeZone timezone = cal.getTimeZone();
AppCalendar qCal = new AppCalendar(timezone);
qCal.setDateToday();
qCal.setTimeNow();
}
public static String createTempName(final TimeZone timeZone) {
final AppCalendar calendar = new AppCalendar(timeZone);
calendar.setDateToday();
calendar.setTimeNow();
synchronized (sdf) {
return sdf.format(calendar.getTime());
}
}
我提到我的代码在 JVM 7 上运行,我必须使用此上下文提供的日期类型。不幸的是,无法使用 Java 8 中的 thred save LocalDate。我正在使用从方法 createTempName 返回的字符串作为数据库列中的唯一键。 appCalendar 是扩展 java.util.GregorianCalendar 的类。
此致,
【问题讨论】:
-
你的代码看起来坏了,你混合了类参数和函数调用,你能更新你的代码吗?
-
在 Java 7 中,您可以使用 JodaTime。否则,是的,您的代码看起来还不错。但是,如果您真的在多个线程中使用此代码,您将在
sdf的同步监视器上发生争用 - 最好使用 ThreadLocal 变量。 -
@JohnnyAW 是的,他确实需要
synchronized,这就是这个问题的重点。阅读SimpleDateFormat的Javadoc:“如果多个线程同时访问一个格式,则必须对外同步。” -
这甚至不能编译。 qCal.setXXX 方法凭空出现,末尾有一些额外的 }。
-
@ErwinBolwidt ups,我的错
标签: java multithreading concurrency