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.evaluate和XPathExpression.evaluate不应该同时调用。它们不是线程安全的。
通常,当我处理不是线程安全的类时,我只使用局部变量,但因为XPathFactory.newInstance()不是线程安全的,而且它是一个静态方法,我不确定如何安全有效地使用它。我想我可以同步对 的调用newInstance,但我担心性能,因为我的应用程序是一个 XML 消息路由应用程序。(在我的烟雾测试中,newInstance它需要大约 0.4 毫秒。)
我找不到任何以线程安全方式使用 Java XPath 的示例,而且我不确定我知道如何以线程安全但高效的方式使用 XPath。我还需要在单例(特别是Apache Camel Processor)中使用 XPath 的约束。
我认为
XPathFactory.newInstance()(静态方法)不应同时调用。它不是线程安全的。
该文档可以有不同的解释:线程安全和可重入是不同的属性,因此XPathFactory.newInstance()线程安全但不可重入是可能的。递归这个词似乎很关键;但句子结构很难解析。如果不仔细检查代码,任何newInstance调用的同步似乎是使用它们的唯一安全方法。请注意,Java 9 添加了该newDefaultInstance方法,该方法似乎是线程安全的。
我认为
XPath.evaluate不XPathExpression.evaluate应该同时调用。它们不是线程安全的。
同意。文档明确指出这些方法既不是线程安全的也不是可重入的。
| 归档时间: |
|
| 查看次数: |
1910 次 |
| 最近记录: |