27

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

JavaDoc 没有提到这个问题,但是Java 1.4中同一个类的 JavaDoc特别指出它不是并发的;所以我可以假设在 1.6 中是这样吗?

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

4

3 回答 3

28

尽管 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);
            }
        }
    };

(免责声明:与其说是试图编译代码。)

于 2008-09-11T15:07:39.180 回答
21

DocumentBuilder 上有一个 reset() 方法,可以将其恢复到首次创建时的状态。如果您要使用 ThreadLocal 路线,请不要忘记调用它,否则您会被淹没。

于 2008-10-23T20:44:17.733 回答
4

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

于 2013-09-16T08:17:10.563 回答