【问题标题】:Is DocumentBuilderFactory thread-safe in Java 5+?Java 5+ 中的 DocumentBuilderFactory 是线程安全的吗?
【发布时间】:2012-04-07 08:48:23
【问题描述】:

javax.xml.parsers.DocumentBuilderFactoryJava 1.4 doc 明确表示:

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

但是,Java 5Java 6 文档没有提及此类内容。 DocumentBuilderFactory 现在是线程安全的吗,还是 Sun 只是认为警告太过分了,人们应该知道得更多?

【问题讨论】:

  • 不是重复的,问题是多个线程使用同一个工厂构造 DocumentBuilders 是否安全,而不是尝试使用同一个构建器解析多个文档是否安全.
  • @DavidMoles 你得出结论了吗? Java 8 文档说Once an application has obtained a reference to a DocumentBuilderFactory it can use the factory to configure and obtain parser instances.
  • @mukund 我从来没有这样做过,但我浏览了一下源代码,我会说它可能不安全。请参阅我刚刚添加的answer

标签: java multithreading jaxp


【解决方案1】:

我已经有一段时间没有真正看过这个了,但是查看DocumentBuilderFactoryImplDocumentBuilderImpl 的源代码在我看来这可能是个坏主意。工厂有一堆内部状态,构建器在构建过程中修改了该状态——参见DocumentBuilderImpl 构造函数中的the call to setDocumentBuilderFactoryAttributes

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 一个方法不需要“同步”就可以是线程安全的。
    【解决方案3】:

    既然在不告诉我的钱的情况下让它线程安全会非常糟糕,所以它仍然不安全。您可以使用断点自行测试。

    【讨论】:

      猜你喜欢
      • 2011-03-07
      • 2010-12-16
      • 2016-08-24
      • 1970-01-01
      • 2019-04-23
      • 2011-12-09
      相关资源
      最近更新 更多