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

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

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

4

1 回答 1

31

重用

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

线程安全

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

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

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

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

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

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

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

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

于 2010-08-09T17:47:07.640 回答