【问题标题】:Is Guava's ImmutableList.Builder thread safe?Guava 的 ImmutableList.Builder 线程安全吗?
【发布时间】:2010-05-20 03:01:11
【问题描述】:

Guava 的 ImmutableList.Builder 的线程安全保证是什么? javadocs 没有说。

【问题讨论】:

    标签: guava


    【解决方案1】:

    虽然 Guava Immutable 类是线程安全的,但它们的构建器却不是。对于大多数应用程序,只有一个线程会与任何特定的 Builder 实例进行交互。

    虽然通常不需要记录缺乏线程安全性,但这样的 Javadoc 可能对不可变集合构建器有意义。人们可能会惊讶于 ImmutableList 是线程安全的,而 ImmutableList.Builder 不是。

    【讨论】:

    【解决方案2】:

    如果 javadocs 中没有提到线程安全,请不要假设!

    更严重的是,“不”。

    我也更喜欢 ImmutableList 和朋友的 javadocs 包含这样一个 - 相当明显的,是的 - 评论(所以你不必自己假设它),因为“显而易见”并不总是如此。就在前几天,我正在讨论scala.List,一个不可变的列表,以及如果在线程之间不恰当地交换(通过数据竞争)可能导致的一些令人惊讶的问题,人们没有考虑到这些问题,因为他们看到了“不可变”这个词锡,加上它们等同于“不可变 == 线程安全”,因此即使在记录“明显”线程安全方面时,保持安全也是值得的。

    【讨论】:

      【解决方案3】:

      同意@Dimitris Andreou:如果没有记录,绝对不要假设线程安全。当您努力使一个重要的类线程安全时,您希望用户知道它。

      除此之外,我认为构建器最常见的用例将是线程限制的:即在某些方法中作为局部变量。如果需要多个线程来构建一个List,难道真的不可变了吗?

      如果您有多个线程输入一个列表,但想在某个时候对其进行快照并说“不再进行更改,它是不可变的”,那么我会编写一些东西,从这些线程中获取元素并冻结内容当你知道它准备好了时,进入一个新的 ImmutableList。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-07
        • 2020-04-15
        • 2018-07-18
        • 2011-07-04
        相关资源
        最近更新 更多