Подтвердить что ты не робот

Безопасен ли файл DocumentBuilder.parse()?

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

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

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

4b9b3361

Ответ 1

Несмотря на то, что 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);
            }
        }
    };

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

Ответ 2

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