Guava的ImmutableList.Builder线程安全吗?

时间:2010-05-20 03:01:12

标签: guava

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

3 个答案:

答案 0 :(得分:31)

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

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

答案 1 :(得分:13)

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

更严重的是,“不”。

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

答案 2 :(得分:2)

同意@Dimitris Andreou:如果没有记录,那绝对不要假设线程安全。当你努力创建一个非平凡的类线程安全时,你希望用户知道它。

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

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