我需要在 DateFormat bean 中使用 jxls 对象。如果在我的类里面我写了以下内容:

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 添加到这样的字段中。

  • 每次调用 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 转换器时会传递给其他线程)。
  • 创建一个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());
        // ...
    }
    
  • 另一种选择是更改您的代码以使用 jodatime DateTimeFormat 。 DateTimeFormat 类是线程安全的。
  • 10-08 00:26