Является ли DocumentBuilder.parse() потокобезопасным?

StackOverflow https://stackoverflow.com/questions/56737

  •  09-06-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top