Java和XML(JAXP) – 缓存和线程安全怎么样?
-
在使用Java API进行XML处理时,我想知道哪些对象可以重用 (在相同或不同的文档中),JAXP:
DocumentBuilderFactory
-
DocumentBuilder
-
XPath
-
Node
-
(编辑:我忘了这必须在我自己的代码中实现,抱歉)ErrorHandler
-
是建议缓存这些对象还是JAXP实现已经缓存它们?
-
这些对象的(重新)使用是否是线程安全的 ?
重用
在同一个线程中,这些对象可以并且应该被重用。 例如,您可以使用DocumentBuilder来解析多个文档。
线程安全
DocumentBuilderFactory用于明确表示它不是线程安全的,我相信这仍然是正确的:
DocumentBuilderFactory类的实现不保证是线程安全的。 用户应用程序要确保从多个线程中使用DocumentBuilderFactory。
从Stack Overflow,DocumentBuilder似乎也不是线程安全的。 但是在Java SE 5中添加了一个重置方法,允许您重用DocumentBuilders:
- 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())
来自Javadoc的XPath不是线程安全的
XPath对象不是线程安全的,不可重入。 换句话说,应用程序负责确保在任何给定时间不从多个线程使用一个XPath对象,并且在调用evaluate方法时,应用程序可能不会递归调用evaluate方法。
来自Xerces网站的节点不是线程安全的
Xerces DOM实现是否是线程安全的? 不,DOM不要求实现是线程安全的。 如果需要从多个线程访问DOM,则需要向应用程序代码添加适当的锁。
ErrorHandler是一个接口,因此由您的接口实现以确保线程安全。 有关线程安全的指导,您可以从这里开始: