Pregunta

¿Es el estándar Java 1.6? javax.xml.parsers.DocumentBuilder hilo de clase seguro?¿Es seguro llamar al método parse() desde varios subprocesos en paralelo?

El JavaDoc no menciona el problema, pero el JavaDoc para la misma clase en Java 1.4 dice específicamente que no es destinado a ser concurrente;Entonces, ¿puedo asumir que en 1.6 lo es?

La razón es que tengo varios millones de tareas ejecutándose en un ExecutorService y parece costoso llamar a DocumentBuilderFactory.newDocumentBuilder() cada vez.

¿Fue útil?

Solución

Aunque DocumentBuilder.parse parece no mutar el generador, 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 uso 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:Ni siquiera intenté compilar el código).

Otros consejos

Hay un método reset() en DocumentBuilder que lo restaura al estado en el que se creó por primera vez.Si vas por la ruta ThreadLocal, no olvides llamar a esto o estarás arruinado.

También puede consultar este código para realizar una mayor optimización. https://svn.apache.org/repos/asf/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/xml/XmlUtil.java

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top