Является ли DocumentBuilder.parse() потокобезопасным?
-
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