Ist DocumentBuilder.parse() thread-sicher?
-
09-06-2019 - |
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.
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.
Sie können diesen Code auch prüfen weitere Optimierung machen https://svn.apache.org/repos/asf/shindig/trunk/java/common/src/main/java/org/apache/shindig/ common / xml / XmlUtil.java