java - safety - ¿Es seguro el subproceso DocumentBuilder.parse()?
thread safe method java (3)
Hay un método de reinicio () en DocumentBuilder que lo restaura al estado cuando se creó por primera vez. Si vas a la ruta ThreadLocal, no te olvides de llamar a esto o te rocían con una manguera.
¿Es seguro el subproceso de la clase javax.xml.parsers.DocumentBuilder Java 1.6 estándar? ¿Es seguro llamar al método parse () desde varios hilos en paralelo?
El JavaDoc no menciona el problema, pero JavaDoc para la misma clase en Java 1.4 dice específicamente que no está destinado a ser concurrente; Entonces, ¿puedo suponer que en 1.6 es?
La razón es que tengo varias millones de tareas ejecutándose en un ExecutorService, y parece caro llamar a DocumentBuilderFactory.newDocumentBuilder () todo el tiempo.
También puede consultar este código para optimizarlo https://svn.apache.org/repos/asf/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/xml/XmlUtil. Java
Aunque DocumentBuilder.parse no parece mutar el generador que sí lo hace en la implementación predeterminada de Sun JDK (basada en Apache Xerces). Decisión de diseño excéntrico. ¿Qué puedes hacer? Supongo que usar un 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);
}
}
};
(Descargo de responsabilidad: no tanto como intenté compilar el código).