2008-09-11 10 views
26

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

JavaDocにはこの問題は言及されていませんが、Java 1.4のJavaDoc for the same classでは、具体的にはではありません。私は1.6でそれを仮定することができますか?

私はExecutorServiceで数百万のタスクを実行しているので、毎回DocumentBuilderFactory.newDocumentBuilder()を呼び出すのはコストがかかるようです。

答えて

26

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

(免責事項:コードをコンパイルしようとしたとして、そんなにいない)

19

それが最初に作成されたときの状態に復元してDocumentBuilderのリセット()メソッドがあります。あなたがThreadLocalルートに行くなら、これを呼ぶことを忘れないでください。

関連する問題