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,我的错