Frage

Ist die standard-Java-1.6 javax.xml.Parser.DocumentBuilder Klasse thread-sicher?Ist es sicher zum Aufruf der parse () - Methode von mehreren threads parallel?

Die JavaDoc erwähnt nicht das Problem, aber die JavaDoc für die gleiche Klasse in Java 1.4 sagt ausdrücklich, dass es nicht gemeint Auger;also kann ich davon ausgehen, dass in der 1.6 ist es?

Der Grund ist, dass ich mehrere Millionen ausgeführten Aufgaben in einem ExecutorService, und es scheint teuer zu nennen DocumentBuilderFactory.newDocumentBuilder() jedes mal.

War es hilfreich?

Lösung

Auch wenn DocumentBuilder.parse die Erbauer nicht zu mutieren scheint es, die Sun JDK Standardimplementierung funktioniert auf (basierend auf Apache Xerces). Exzentrische Design-Entscheidung. Was kannst du tun? Ich denke, eine Thread verwenden:

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

(Disclaimer:. Nicht so viel wie versucht, den Code zu kompilieren)

Andere Tipps

Es gibt eine Methode reset () auf Document, die sie in den Zustand wieder her, als es zuerst erstellt wurde. Wenn Sie den Thread Weg gehen, vergessen Sie nicht, diese zu nennen oder sind Sie abgespritzt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top