Я хотел бы знать, какие объекты можно повторно использовать (в том же или другом документе) при использовании Java API для обработки XML, JAXP:
DocumentBuilderFactory
DocumentBuilder
XPath
Node
(РЕДАКТИРОВАТЬ: я забыл, что это должно быть реализовано в моем собственном коде, извините)ErrorHandler
Рекомендуется ли кэшировать эти объекты или реализации JAXP уже кэшируют их?
Является ли (повторное) использование этих объектов потокобезопасным?
Java и XML (JAXP) - как насчет кеширования и потоковой безопасности?
Ответы (1)
Повторное использование
В одном потоке эти объекты можно и нужно использовать повторно. Например, вы можете использовать DocumentBuilder для анализа нескольких документов.
Безопасность потоков
DocumentBuilderFactory, используемый для объяснения, что он не является потокобезопасным, я считаю, что это все еще верно:
НЕ гарантируется потокобезопасность реализации класса DocumentBuilderFactory. Пользовательское приложение должно убедиться в использовании DocumentBuilderFactory более чем из одного потока.
Из Stack Overflow DocumentBuilder также не является потокобезопасным. Однако в Java SE 5 был добавлен метод сброса, позволяющий повторно использовать DocumentBuilders:
- Является ли DocumentBuilder.parse () потокобезопасным?
- http://download-llnw.oracle.com/javase/6/docs/api/javax/xml/parsers/DocumentBuilder.html#reset().
- http://www.junlu.com/msg/289939.html (о DocumentBuilder .перезагрузить())
XPath не является потокобезопасным, из Javadoc
Объект XPath не является потокобезопасным и не реентерабельным. Другими словами, приложение несет ответственность за то, чтобы один объект XPath не использовался более чем из одного потока в любой момент времени, и пока вызывается метод оценки, приложения не могут рекурсивно вызывать метод оценки.
Узел не является потокобезопасным, с веб-сайта Xerces
Является ли реализация Xerces DOM потокобезопасной? Нет. DOM не требует, чтобы реализации были потокобезопасными. Если вам нужно получить доступ к DOM из нескольких потоков, вам необходимо добавить соответствующие блокировки в код вашего приложения.
ErrorHandler - это интерфейс, поэтому безопасность потоков зависит от вашей реализации этого интерфейса. Для указателей на безопасность потоков вы можете начать здесь: