(Подобный вопрос был задан здесь, Java XPathFactory потокобезопасность , но данный ответ неверен, поскольку игнорирует тот факт, что в документации указано, что XPathFactory.newInstance()
не является потокобезопасным.)
Из XPathFactory Javadoc мы имеем:
Класс XPathFactory не является поточно-ориентированным.Другими словами, приложение должно гарантировать, что не более одного потока использует объект XPathFactory в любой данный момент.Реализациям рекомендуется помечать методы как синхронизированные, чтобы защитить себя от неработающих клиентов.
XPathFactory не является повторно входящим.В то время как один из методов newInstance вызывается, приложения могут не пытаться рекурсивно вызывать метод newInstance, даже из того же потока.
Так что из приведенной выше цитаты я понимаю, что XPathFactory.newInstance()
(статический метод) не должен вызываться одновременно.Это не потокобезопасно.
Фабрика возвращает объекты XPath, которые имеют этот XPath Javadoc :
Объект XPath не является потоковымбезопасно и не реентерабельноДругими словами, приложение несет ответственность за то, чтобы один объект XPath не использовался из более чем одного потока в любой момент времени, и хотя метод оценки вызывается, приложения не могут рекурсивно вызывать метод оценки.
Из приведенной выше цитаты я понимаю, что XPath.evaluate
и XPathExpression.evaluate
не должны вызываться одновременно.Они не поточнобезопасны.
Обычно, когда я имею дело с классами, не поточнобезопасными, я просто использую локальные переменные, но потому что XPathFactory.newInstance()
не поточнобезопасен, иэто статический метод, я не уверен, как использовать его безопасно и эффективно.Думаю, я мог бы синхронизировать вызовы с newInstance
, но я беспокоюсь о производительности, потому что мое приложение является приложением маршрутизации сообщений XML.(В моих тестах дыма newInstance
это занимает ~ 0,4 миллисекунды.)
Я не могу найти никаких примеров использования Java XPath в поточно-ориентированном режиме, и я не уверен, что знаю, какиспользуйте XPath потокобезопасным, но эффективным способом.У меня также есть ограничение на использование XPath внутри синглтона (в частности, Apache Camel Processor ).