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
添加到这样的字段。
- 您可以在每次调用时创建一个
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 class 是线程安全的。
我需要在 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
添加到这样的字段。
- 您可以在每次调用时创建一个
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 class 是线程安全的。