Java Simpledate的线程安全代码
请告诉我以下代码是否是线程安全的,以及如何测试它:Java Simpledate的线程安全代码,java,multithreading,concurrency,Java,Multithreading,Concurrency,请告诉我以下代码是否是线程安全的,以及如何测试它: private static final SimpleDateFormat sdf = new SimpleDateFormat("MMddHHmmss"); Calendar cal = new GregorianCalendar(); TimeZone timezone = cal.getTimeZone(); AppCalendar qCal = new AppCalendar(timezone);
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());
}
}
我提到我的代码在JVM7上运行,我必须使用这个上下文提供的日期类型。不幸的是,无法从Java 8使用thred save LocalDate。我使用方法createTempName返回的字符串作为数据库列中的唯一键。appCalendar是扩展java.util.GregorianCalendar的类
诚恳地说,是的,它是线程安全的。您可以像在中所做的那样对其进行测试。如果性能有问题,我建议将同步更改为ThreadLocal,如中所示。您的代码看起来已损坏,您混合了类参数和函数调用,是否可以更新代码?在Java 7中,您可以使用JodaTime。否则,是的,您的代码看起来不错。但是,如果您真的从多个线程使用此代码,您将在同步监视器上的
sdf
上发生冲突-最好使用ThreadLocal变量。@JohnnyAW是的,他确实需要同步的,这就是这个问题的全部要点。阅读SimpleDataFormat
的Javadoc:“如果多个线程同时访问一种格式,它必须在外部同步。”这甚至不会编译。qCal.setXXX方法凭空出现,最后有一些额外的}。@ErwinBolwidt-ups,我的错