如何以线程安全且高效的方式使用 XPath?

Dav*_*idS 7 java xpath multithreading

(这里有一个类似的问题,Java XPathFactory thread-safety,但给出的答案是不正确的,因为它忽略了文档声明XPathFactory.newInstance()不是线程安全的事实。)

XPathFactory Javadoc,我们有:

XPathFactory 类不是线程安全的。换句话说,应用程序有责任确保在任何给定时刻至多有一个线程在使用 XPathFactory 对象。鼓励实现将方法标记为同步以保护自己免受损坏的客户端的影响。

XPathFactory 不可重入。在调用 newInstance 方法之一时,应用程序可能不会尝试递归调用 newInstance 方法,即使是从同一线程。

因此,从上面的引用中,我认为XPathFactory.newInstance()不应同时调用(静态方法)。它不是线程安全的。

工厂返回 XPath 对象,其中包含此XPath Javadoc

XPath 对象不是线程安全的,也不是可重入的。换句话说,应用程序有责任确保在任何给定时间不会从多个线程使用一个 XPath 对象,并且在调用评估方法时,应用程序可能不会递归调用评估方法。

从上面的报价,我认为XPath.evaluateXPathExpression.evaluate不应该同时调用。它们不是线程安全的。

通常,当我处理不是线程安全的类时,我只使用局部变量,但因为XPathFactory.newInstance()不是线程安全的,而且它是一个静态方法,我不确定如何安全有效地使用它。我想我可以同步对 的调用newInstance,但我担心性能,因为我的应用程序是一个 XML 消息路由应用程序。(在我的烟雾测试中,newInstance它需要大约 0.4 毫秒。)

我找不到任何以线程安全方式使用 Java XPath 的示例,而且我不确定我知道如何以线程安全但高效的方式使用 XPath。我还需要在单例(特别是Apache Camel Processor)中使用 XPath 的约束。

jac*_*646 7

我认为XPathFactory.newInstance()(静态方法)不应同时调用。它不是线程安全的。

该文档可以有不同的解释:线程安全和可重入是不同的属性,因此XPathFactory.newInstance()线程安全但不可重入是可能的。递归这个词似乎很关键;但句子结构很难解析。如果不仔细检查代码,任何newInstance调用的同步似乎是使用它们的唯一安全方法。请注意,Java 9 添加了该newDefaultInstance方法,该方法似乎是线程安全的。

我认为XPath.evaluateXPathExpression.evaluate应该同时调用。它们不是线程安全的。

同意。文档明确指出这些方法既不是线程安全的也不是可重入的。