我想知道在使用Java API 进行 XML处理 JAXP时可以重用哪些对象(在相同或不同的文档中) :
DocumentBuilderFactory
DocumentBuilder
XPath
Node
(编辑:我忘了这必须在我自己的代码中实现,抱歉)ErrorHandler
是否建议缓存这些对象或者 JAXP 实现是否已经缓存了它们?
这些对象的(重新)使用是线程安全的吗?
1 回答
重用
在同一个线程中,这些对象可以而且应该被重用。例如,您可以使用 DocumentBuilder 来解析多个文档。
线程安全
DocumentBuilderFactory 曾经明确声明它不是线程安全的,我相信这仍然是正确的:
DocumentBuilderFactory 类的实现不能保证是线程安全的。由用户应用程序确保从多个线程使用 DocumentBuilderFactory。
从 Stack Overflow 来看,DocumentBuilder 似乎也不是线程安全的。但是在 Java SE 5 中添加了一个重置方法以允许您重用 DocumentBuilder:
- DocumentBuilder.parse() 线程安全吗?
- http://download-llnw.oracle.com/javase/6/docs/api/javax/xml/parsers/DocumentBuilder.html#reset()
- http://www.junlu.com/msg/289939.html(关于DocumentBuilder.reset())
XPath 不是线程安全的,来自 Javadoc
XPath 对象不是线程安全的,也不是可重入的。换句话说,应用程序有责任确保在任何给定时间不会从多个线程中使用一个 XPath 对象,并且在调用评估方法时,应用程序可能不会递归调用评估方法。
节点不是线程安全的,来自 Xerces 网站
Xerces DOM 实现是线程安全的吗?不,DOM 不要求实现是线程安全的。如果您需要从多个线程访问 DOM,则需要在应用程序代码中添加适当的锁。
ErrorHandler 是一个接口,因此由您对该接口的实现来确保线程安全。有关线程安全的指针,您可以从这里开始: