【问题标题】:Thread safe code for SimpledateSimpledate 的线程安全代码
【发布时间】: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


【解决方案1】:

是的,它是线程安全的。您可以像在"Java DateFormat is not threadsafe" what does this leads to? 中那样对其进行测试。如果性能是一个问题,我建议将同步更改为 ThreadLocal,如 Making DateFormat Threadsafe. What to use, synchronized or Thread local

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-03
    • 2014-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    相关资源
    最近更新 更多