javax.xml.parsers.DocumentBuilderFactory
的Java 1.4 doc以明确的术语表示:
不能保证DocumentBuilderFactory类的
实现是线程安全的。用户应用程序负责确保从多个线程使用DocumentBuilderFactory。或者,应用程序可以为每个线程提供一个DocumentBuilderFactory实例。应用程序可以使用相同的工厂实例来获取DocumentBuilder的一个或多个实例,前提是该工厂的实例不会同时在多个线程中使用。
然而,Java 5和Java 6的文档却没有提到这一点。DocumentBuilderFactory
现在是线程安全的吗,或者Sun只是觉得这个警告有点过头了,人们应该更清楚?
发布于 2021-07-22 08:50:21
我实际上已经有一段时间没有考虑过这个问题了,但是看看DocumentBuilderFactoryImpl
和DocumentBuilderImpl
的源代码,我觉得这可能不是一个好主意。工厂有一堆内部状态,构建器在其构造过程中修改该状态--请参阅DocumentBuilderImpl
构造函数中的the call to setDocumentBuilderFactoryAttributes
。
如果你知道你永远不会传递这些属性,你也许能够逃脱惩罚,但为了安全起见,我想把整个东西包装在其他不会暴露危险部分的对象中,我认为只需确保每个线程有一个单独的工厂就可以了。
发布于 2019-01-04 03:22:37
根据单例DocumentBuilderFactory的文档,newInstance方法不是同步的,因此,DocumentBuilderFactory在Java8中仍然不是线程安全的……在Java 11中也不是。实际上,构造函数从Java1.4开始就没有变化。
发布于 2012-03-23 02:28:15
因为在没有告诉我钱的情况下让它的线程安全是非常糟糕的,所以它仍然是不安全的。您可以使用断点自己测试这一点。
https://stackoverflow.com/questions/9828254
复制相似问题