DocumentBuilder.parse()线程安全吗?

标准的Java 1.6 javax.xml.parsers.DocumentBuilder类线程是否安全? 从多个线程并行调用parse()方法是否安全?

JavaDoc没有提到这个问题,但Java 1.4中同一类的JavaDoc明确表示它并不意味着并发; 所以我可以假设在1.6中它是?

原因是我在ExecutorService中运行了数百万个任务,每次调用DocumentBuilderFactory.newDocumentBuilder()似乎都很昂贵。

即使DocumentBuilder.parse看起来不会改变它在Sun JDK默认实现(基于Apache Xerces)上的构建器。 偏心的设计决定。 你能做什么? 我想使用ThreadLocal:

private static final ThreadLocal builderLocal = new ThreadLocal() { @Override protected DocumentBuilder initialValue() { try { return DocumentBuilderFactory .newInstance( "xx.MyDocumentBuilderFactory", getClass().getClassLoader() ).newDocumentBuilder(); } catch (ParserConfigurationException exc) { throw new IllegalArgumentException(exc); } } }; 

(免责声明:与尝试编译代码不同。)

DocumentBuilder上有一个reset()方法,它将它恢复到第一次创建时的状态。 如果您要使用ThreadLocal路线,请不要忘记给它打电话或者你已经被软管了。

您还可以检查此代码以进行进一步优化https://svn.apache.org/repos/asf/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/xml/XmlUtil。 java的