DocumentBuilder 线程安全吗?
我正在查看的当前代码库使用 DOM 解析器。以下代码片段在 5 个方法中重复:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
如果在循环中调用包含上述代码的方法,或者在应用程序中多次调用该方法,则我们将承担为每次调用此类方法创建新的 DocumentBuilderFactory 实例和一个新 DocumentBuilder 实例的开销。
在 DocumentBuilder 工厂和 DocumentBuilder 实例周围创建一个单例包装器是一个好主意,如下所示:
public final class DOMParser {
private DocumentBuilderFactory = new DocumentBuilderFactory();
private DocumentBuilder builder;
private static DOMParser instance = new DOMParser();
private DOMParser() {
builder = factory.newDocumentBuilder();
}
public Document parse(InputSource xml) {
return builder.parser(xml);
}
}
如果在多个线程之间共享上述单例,是否会出现任何问题?如果不是,使用上述方法在应用程序的生存期内仅创建一次 DocumentBuilderFactory 和 DocumentBuilder 实例,是否会提高性能?
编辑:
我们唯一可能遇到的问题是,如果 DocumentBuilder 在解析 XML 文件时保存了一些状态信息,这可能会影响下一个 XML 文件的解析。