DocumentBuilderFactory在Java 5+中是线程安全的吗?

2022-09-02 14:15:13

Java 1.4 文档明确地用于各州:javax.xml.parsers.DocumentBuilderFactory

DocumentBuilderFactory 类的实现不保证是线程安全的。由用户应用程序来确保从多个线程使用 DocumentBuilderFactory。或者,应用程序可以为每个线程具有一个 DocumentBuilderFactory 实例。应用程序可以使用工厂的同一实例来获取 DocumentBuilder 的一个或多个实例,前提是工厂的实例一次未在多个线程中使用。

然而,Java 5Java 6 文档却没有说这种话。现在是线程安全的,还是Sun只是认为警告是过度的,人们应该知道得更好?DocumentBuilderFactory


答案 1

根据singleton DocumentBuilderFactory的文档,newInstance方法没有同步,然后,DocumentBuilderFactory在Java 8中仍然不是线程安全...在Java 11中也没有。实际上,自Java 1.4以来,构造函数没有变化。


答案 2

我有一段时间没有真正看过这个了,但是看看DocumentBuilderFactoryImplDocumentBuilderImpl的源代码,在我看来,这可能是一个坏主意。工厂有一堆内部状态,构建器在构建过程中修改了该状态 - 请参阅构造函数中setDocumentBuilderFactoryAttributes的调用DocumentBuilderImpl

如果你知道你永远不会传递这些属性,你也许可以逃脱它,但为了安全起见,我想把整个东西包装在一些不会暴露危险位的其他对象中,我认为确保每个线程都有一个单独的工厂会更容易。