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 に答える