gpt4 book ai didi

java - JSF 自定义日期转换器 - 线程安全吗?

转载 作者:搜寻专家 更新时间:2023-11-01 01:38:31 24 4
gpt4 key购买 nike

我在 JSF 1.2 中创建了一个自定义的 Converter 来转换 Date 对象。日期有一个非常特殊的格式。我已经使用核心 Java SimpleDateFormat 类实现了我的转换器来进行转换,使用下面代码注释中显示的格式化程序字符串。这一切都很好。

我的问题是关于线程安全的。 SimpleDateFormat API 文档声明它不是线程安全的。出于这个原因,我为我的转换器对象的每个实例创建了一个单独的日期格式对象实例。但是,我不确定这是否足够。我的 DateFormat 对象存储为 DTGDateConverter 的成员。

问题:两个线程是否会同时访问 JSF 中 Converter 对象的同一个实例?

如果答案是肯定的,那么我的 Converter 可能存在风险。

/**
* <p>JSF Converter used to convert from java.util.Date to a string.
* The SimpleDateFormat format used is: ddHHmm'Z'MMMyy.</p>
*
* <p>Example: October 31st 2010 at 23:59 formats to 312359ZOCT10</p>
*
* @author JTOUGH
*/
public class DTGDateConverter implements Converter {

private static final Logger logger =
LoggerFactory.getLogger(DTGDateConverter.class);

private static final String EMPTY_STRING = "";

private static final DateFormat DTG_DATE_FORMAT =
MyFormatterUtilities.createDTGInstance();

// The 'format' family of core Java classes are NOT thread-safe.
// Each instance of this class needs its own DateFormat object or
// runs the risk of two request threads accessing it at the same time.
private final DateFormat df = (DateFormat)DTG_DATE_FORMAT.clone();

@Override
public Object getAsObject(
FacesContext context,
UIComponent component,
String stringValue)
throws ConverterException {
Date date = null;
// Prevent ParseException when an empty form field is submitted
// for conversion
if (stringValue == null || stringValue.equals(EMPTY_STRING)) {
date = null;
} else {
try {
date = df.parse(stringValue);
} catch (ParseException e) {
if (logger.isDebugEnabled()) {
logger.debug("Unable to convert string to Date object", e);
}
date = null;
}
}
return date;
}

@Override
public String getAsString(
FacesContext context,
UIComponent component,
Object objectValue)
throws ConverterException {
if (objectValue == null) {
return null;
} else if (!(objectValue instanceof Date)) {
throw new IllegalArgumentException(
"objectValue is not a Date object");
} else {
// Use 'toUpperCase()' to fix mixed case string returned
// from 'MMM' portion of date format
return df.format(objectValue).toUpperCase();
}
}

}

最佳答案

Will two threads every simultaneously access the same instance of a Converter object in JSF?

取决于您如何使用转换器。如果你使用

<h:inputWhatever>
<f:converter converterId="converterId" />
</h:inputWhatever>

然后将为 View 中的每个输入元素创建一个新实例,这是线程安全的(除了非常罕见的边缘情况,即最终用户在同一 session 的两个浏览器选项卡中有两个相同的 View 并同时在两种观点)。

如果你使用

<h:inputWhatever converter="#{applicationBean.converter}" />

那么同一个实例将在整个应用程序的所有 View 之间共享,因此这不是线程安全的。

然而,您每次创建转换器时都会克隆一个静态 DataFormat 实例。那部分已经不是线程安全的。您可能会冒着克隆实例的风险,因为它的内部状态已更改,因为它已在其他地方使用过。此外,克隆现有实例并不一定比创建新实例便宜。

无论您如何使用转换器,我都建议只将其声明为线程局部的(即在方法 block 内)。如果每次创建 DateFormat 的成本是一个主要问题(您是否分析过它?),那么请考虑将其替换为 JodaTime .

关于java - JSF 自定义日期转换器 - 线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4430522/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com