Java和XML(JAXP) – 缓存和线程安全怎么样?

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

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

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

重用

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

线程安全

DocumentBuilderFactory用于明确表示它不是线程安全的,我相信这仍然是正确的:

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

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

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

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

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

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

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