2008-09-11 142 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路由,请不要忘记调用它,否则你会崩溃。