2008-09-11 8 views
26

Ist der Standard Java 1.6 javax.xml.parsers.DocumentBuilder Klasse Thread sicher? Ist es sicher, die parse() Methode von mehreren Threads parallel aufzurufen?Ist DocumentBuilder.parse() Thread sicher?

Die JavaDoc erwähnt das Problem nicht, aber die JavaDoc for the same class in Java 1.4 sagt ausdrücklich, dass es ist nicht soll gleichzeitig sein; also kann ich davon ausgehen, dass es in 1.6 ist?

Der Grund ist, dass ich mehrere Millionen Aufgaben in einem ExecutorService ausführen, und es scheint teuer, DocumentBuilderFactory.newDocumentBuilder() jedes Mal aufzurufen.

Antwort

26

Obwohl DocumentBuilder.parse den Builder scheinbar nicht mutiert, wird dies in der Sun JDK-Standardimplementierung (basierend auf Apache Xerces) durchgeführt. Exzentrische Designentscheidung. Was kannst du tun? Ich denke, verwenden Sie einen Thread:

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

(Haftungsausschluss: Nicht so sehr wie den Code zu kompilieren versucht.)

19

Es gibt eine Methode reset() auf Document, die sie in den Zustand wieder her, wenn es zum ersten Mal erstellt wurde . Wenn Sie die ThreadLocal-Route gehen, vergessen Sie nicht, dies anzurufen, oder Sie werden abgespritzt.