簡體   English   中英

Java - 同步DateFormat - jxls

[英]Java - synchronized 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對象?

不,你不能添加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類是線程安全的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM