-
Я хотел бы знать, какие объекты можно использовать повторно (в том же или другом документе) при использовании обработки Java API для XML, JAXP:
-
DocumentBuilderFactory
-
DocumentBuilder
-
XPath
-
Node
-
ErrorHandler
-
-
Рекомендуется ли кешировать эти объекты или реализация JAXP уже кэширует их?
-
Используется ли (re) для этих объектов потокобезопасным?
Java и XML (JAXP). Как насчет кэширования и безопасности потоков?
Ответ 1
Многократное
В том же потоке эти объекты могут и должны использоваться повторно. Например, вы можете использовать DocumentBuilder для анализа нескольких документов.
Безопасность потоков
DocumentBuilderFactory, используемый для объяснения состояния, не был потокобезопасным, я считаю, что это все еще так:
Реализация Класс DocumentBuilderFactory НЕ гарантированно быть потокобезопасным. Это до к пользовательскому приложению, чтобы убедиться об использовании DocumentBuilderFactory больше, чем один поток.
Из DocumentBuilder также не является потокобезопасным. Однако в Java SE 5 был добавлен метод reset, позволяющий повторно использовать 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.reset())
XPath не является потокобезопасным, из Javadoc
Объект XPath не является потокобезопасным и не реентерабельный. Другими словами, это ответственность за применение убедитесь, что один объект XPath не используется из нескольких потоков заданное время, а при оценке метод, приложения могут не рекурсивно называют оценку Метод.
Node не является потокобезопасным, с сайта Xerces
Реализация Xerces DOM потокобезопасный? Нет. DOM не требуют, чтобы реализации были потоками безопасно. Если вам нужен доступ к DOM из нескольких потоков, вы требуется добавить соответствующие блокировки на ваш код приложения.
ErrorHandler - это интерфейс, поэтому для обеспечения безопасности потоков необходима реализация этого интерфейса. Для указателей на безопасность потоков вы можете начать здесь: