关于java:DocumentBuilder.parse()线程安全吗?

关于java:DocumentBuilder.parse()线程安全吗?

Is DocumentBuilder.parse() thread safe?

标准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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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);
            }
        }
    };

(免责声明:与其说是编译代码,不如说是。)


DocumentBuilder上有一个reset()方法,可将其恢复到首次创建时的状态。如果您要使用ThreadLocal路由,请不要忘记调用此方法,否则您将陷入困境。


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


推荐阅读