19

Java 1.4 doc for javax.xml.parsers.DocumentBuilderFactorystates 毫不含糊:

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

然而, Java 5Java 6文档并没有这样说。现在是DocumentBuilderFactory线程安全的,还是 Sun 只是认为警告过分了,人们应该知道得更多?

4

3 回答 3

3

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

于 2019-01-03T19:22:36.750 回答
1

我已经有一段时间没有真正看过这个了,但是看看它的来源,DocumentBuilderFactoryImplDocumentBuilderImpl我看来这可能是一个坏主意。工厂有一堆内部状态,构建器在其构建过程中修改了该状态——参见构造函数中的调用setDocumentBuilderFactoryAttributesDocumentBuilderImpl

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

于 2021-07-22T00:50:20.603 回答
-6

由于在不告诉我的钱的情况下使其线程安全的品味极差,因此它仍然不安全。您可以使用断点自行测试。

于 2012-03-22T18:28:15.307 回答