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

时间:2010-08-09 11:23:19

标签: java xml multithreading caching jaxp

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

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

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

1 个答案:

答案 0 :(得分:27)

<强>重用

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

线程安全

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

  

实施   DocumentBuilderFactory类不是   保证是线程安全的。它起来了   到用户应用程序以确保   关于使用的   来自多个的DocumentBuilderFactory   一个帖子。

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

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

  

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

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

  

是Xerces DOM实现   线程安全的?没有.DOM没有   要求实现是线程   安全。如果您需要访问DOM   从多个线程,你是   需要添加适当的锁   到您的应用程序代码。

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