Question

Est-ce que le standard Java 1.6 javax.xml.parsers.DocumentBuilder classe thread-safe ?Est-il sécuritaire d’appeler la méthode parse() à partir de plusieurs threads en parallèle ?

Le JavaDoc ne mentionne pas le problème, mais le JavaDoc pour la même classe dans Java 1.4 dit spécifiquement qu'il n'est-ce pas censé être concurrent;alors puis-je supposer que c'est le cas dans la version 1.6 ?

La raison en est que plusieurs millions de tâches sont en cours d'exécution dans un ExecutorService et qu'il semble coûteux d'appeler DocumentBuilderFactory.newDocumentBuilder() à chaque fois.

Était-ce utile?

La solution

Même si DocumentBuilder.parse ne semble pas muter le générateur, il le fait sur l'implémentation par défaut de Sun JDK (basée sur Apache Xerces).Décision de conception excentrique.Que pouvez-vous faire?Je suppose que j'utilise 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);
            }
        }
    };

(Clause de non-responsabilité:Pas même une tentative de compilation du code.)

Autres conseils

Il existe une méthode reset() sur DocumentBuilder qui le restaure à l'état dans lequel il a été créé pour la première fois.Si vous empruntez la route ThreadLocal, n'oubliez pas d'appeler ceci ou vous êtes arrosé.

Vous pouvez également vérifier ce code pour effectuer une optimisation supplémentaire https://svn.apache.org/repos/asf/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/xml/XmlUtil.java

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top