質問

標準の Java 1.6 です javax.xml.parsers.DocumentBuilder クラススレッドセーフ?複数のスレッドから parse() メソッドを並行して呼び出すのは安全ですか?

JavaDoc ではこの問題については言及されていませんが、 同じクラスの JavaDoc Java 1.4では具体的に次のように述べています そうではありません 同時であることを意味します。では、1.6 ではそうなっていると考えてよいでしょうか?

その理由は、ExecutorService で数百万のタスクを実行しており、毎回 DocumentBuilderFactory.newDocumentBuilder() を呼び出すのはコストがかかると思われるためです。

役に立ちましたか?

解決

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

(免責事項:コードをコンパイルしようとしたほどではありません。)

他のヒント

DocumentBuilder には、最初に作成されたときの状態に戻すreset() メソッドがあります。ThreadLocal ルートを選択する場合は、これを呼び出すことを忘れないでください。そうしないと大変です。

このコードをチェックしてさらに最適化することもできます https://svn.apache.org/repos/asf/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/xml/XmlUtil.java

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top