2008-09-11 10 views
26

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

el Javadoc no menciona el tema, pero el JavaDoc for the same class en Java 1.4 dice específicamente que no es 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.

Respuesta

26

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

(Negación: No tanto como se trató de compilar el código.)

19

Hay un método de reset() en DocumentBuilder que restaura al estado en que 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.

Cuestiones relacionadas