2008-09-11 202 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

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

(免責聲明:與其說是試圖編譯代碼。)

19

有上的DocumentBuilder重置()方法,將其恢復的狀態時,首次建立它。如果你正在使用ThreadLocal路由,請不要忘記調用它,否則你會崩潰。