DocumentBuilder.parse() thread 安全吗?

2022-09-01 14:05:36

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

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

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


答案 1

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

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


答案 2

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


推荐