DocumentBuilder.parse () поток безопасен? - PullRequest
26 голосов
/ 11 сентября 2008

Безопасен ли поток класса Java 1.6 javax.xml.parsers.DocumentBuilder ? Безопасно ли вызывать метод parse () из нескольких потоков параллельно?

JavaDoc не упоминает о проблеме, но JavaDoc для того же класса в Java 1.4, в частности, говорит, что не означает одновременность; так можно ли предположить что в 1.6 это так?

Причина в том, что у меня в ExecutorService запущено несколько миллионов задач, и каждый раз кажется дорого вызывать DocumentBuilderFactory.newDocumentBuilder ().

Ответы [ 3 ]

26 голосов
/ 11 сентября 2008

Несмотря на то, что DocumentBuilder.parse, по-видимому, не изменяет компоновщик, он делает это в стандартной реализации Sun JDK (на основе Apache Xerces). Эксцентричное дизайнерское решение. Что ты можешь сделать? Я предполагаю использовать 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);
            }
        }
    };

(Отказ от ответственности: не так много, как попытка скомпилировать код.)

19 голосов
/ 24 октября 2008

В DocumentBuilder есть метод reset (), который восстанавливает его до состояния, в котором он был впервые создан. Если вы едете по маршруту ThreadLocal, не забудьте позвонить по этому номеру, иначе вы попадаете.

3 голосов
/ 16 сентября 2013

Вы также можете проверить этот код для дальнейшей оптимизации https://svn.apache.org/repos/asf/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/xml/XmlUtil.java

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...