Java - 同步日期格式 - jxls

Java - synchronized DateFormat - jxls

我需要在 jxls 个 bean 中使用 DateFormat 个对象。如果在我的 class 中写下以下内容:

private synchronized DateFormat df = new SimpleDateFormat("dd.MM.yyyy");

它会是线程安全的吗?在同一个 class 我有一个方法:

public void doSomething() {
    Map<String,String> beans = new HashMap<String,String>();
    beans.put("df",df);
    XLSTransformer transformer = new XLSTransformer();
    transformer.transformXLS("template.xls", beans, "result.xls");
}

从多个线程调用。

如果 synchronized 字段在这种情况下没有帮助,我可以做些什么来从 jxls 提供线程安全的日期格式,而无需每次都创建新的 DateFormat 对象?

不,你不能将 synchronized 添加到这样的字段。

  1. 您可以在每次调用时创建一个 doSomething:

例如:

public void doSomething() {
    Map<String,String> beans = new HashMap<String,String>();
    beans.put("df", new SimpleDateFormat("dd.MM.yyyy"));
    XLSTransformer transformer = new XLSTransformer();
    transformer.transformXLS("template.xls", beans, "result.xls");
}

由于每个调用线程都将获得自己的 SimpleDateFormat 实例,这将是线程安全的(假设 SimpleDateFormat 寿命不长并且在传递给 xslt 转换器时传递给其他线程)。

  1. 创建一个ThreadLocal来处理多线程:

例如:

private static final ThreadLocal<SimpleDateFormat> df =
    new ThreadLocal<Integer>() {
         @Override protected Integer initialValue() {
             return new SimpleDateFormat("dd.MM.yyyy");
     }
 };
 public void doSomething() {
    // ...
    beans.put("df", df.get());
    // ...
}
  1. 另一种选择是更改您的代码以改为使用 jodatime DateTimeFormat。 DateTimeFormat class 是线程安全的。