Java 和 XML (JAXP) - 那么高速缓存和线程安全呢?

2022-09-01 14:34:33
  1. 我想知道在使用Java API进行XML处理JAXP时,哪些对象可以重用(在相同或不同的文档中):

    • DocumentBuilderFactory
    • DocumentBuilder
    • XPath
    • Node
    • ErrorHandler(编辑:我忘记了这必须在我自己的代码中实现,对不起)
  2. 是建议高速缓存这些对象,还是 JAXP 实现已经高速缓存了这些对象?

  3. 这些对象的(重新)使用是否线程安全


答案 1

再使用

在同一线程中,这些对象可以并且应该被重用。例如,您可以使用 DocumentBuilder 分析多个文档。

螺纹安全

DocumentBuilderFactory曾经明确声明它不是线程安全的,我相信这仍然是真的:

DocumentBuilderFactory 类的实现不保证是线程安全的。由用户应用程序来确保从多个线程使用 DocumentBuilderFactory。

从 Stack Overflow 中,DocumentBuilder 似乎也不是线程安全的。但是,在 Java SE 5 中添加了一个 reset 方法,允许您重用 DocumentBuilders:

XPath 不是线程安全的,来自 Javadoc

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

节点不是线程安全的,来自Xerces网站

Xerces DOM实现线程安全吗?不。DOM 不要求实现是线程安全的。如果需要从多个线程访问 DOM,则需要向应用程序代码添加适当的锁。

ErrorHandler 是一个接口,因此由该接口的实现来确保线程安全。有关线程安全的指针,您可以从此处开始:


答案 2