Java – 同步DateFormat – jxls

我需要在jxls bean中使用DateFormat对象.如果在我的班上我写了以下内容:

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

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

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对象?

最佳答案 不,你不能添加同步到这样的字段.

>每次调用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类是线程安全的.

点赞