标准Java 1.6 javax.xml.parsers.DocumentBuilder类线程是否安全?从多个线程并行调用parse()方法是否安全?
JavaDoc没有提到这个问题,但Java 1.4中的JavaDoc for the same class明确指出不是意味着并发;我可以假设在1.6中它是吗?
原因是我在ExecutorService中运行了数百万个任务,每次调用DocumentBuilderFactory.newDocumentBuilder()似乎都很昂贵。
答案 0 :(得分:26)
即使DocumentBuilder.parse看起来不会改变它在Sun JDK默认实现(基于Apache Xerces)上的构建器。偏心的设计决定。你能做什么?我想使用ThreadLocal:
private static final ThreadLocal<DocumentBuilder> builderLocal =
new ThreadLocal<DocumentBuilder>() {
@Override protected DocumentBuilder initialValue() {
try {
return
DocumentBuilderFactory
.newInstance(
"xx.MyDocumentBuilderFactory",
getClass().getClassLoader()
).newDocumentBuilder();
} catch (ParserConfigurationException exc) {
throw new IllegalArgumentException(exc);
}
}
};
(免责声明:与尝试编译代码无关。)
答案 1 :(得分:19)
DocumentBuilder上有一个reset()方法,它将其恢复到首次创建时的状态。如果您要使用ThreadLocal路线,请不要忘记给它打电话或者你已经开了。
答案 2 :(得分:3)