【发布时间】:2010-05-20 03:01:11
【问题描述】:
Guava 的 ImmutableList.Builder 的线程安全保证是什么? javadocs 没有说。
【问题讨论】:
标签: guava
Guava 的 ImmutableList.Builder 的线程安全保证是什么? javadocs 没有说。
【问题讨论】:
标签: guava
虽然 Guava Immutable 类是线程安全的,但它们的构建器却不是。对于大多数应用程序,只有一个线程会与任何特定的 Builder 实例进行交互。
虽然通常不需要记录缺乏线程安全性,但这样的 Javadoc 可能对不可变集合构建器有意义。人们可能会惊讶于 ImmutableList 是线程安全的,而 ImmutableList.Builder 不是。
【讨论】:
如果 javadocs 中没有提到线程安全,请不要假设!
更严重的是,“不”。
我也更喜欢 ImmutableList 和朋友的 javadocs 包含这样一个 - 相当明显的,是的 - 评论(所以你不必自己假设它),因为“显而易见”并不总是如此。就在前几天,我正在讨论scala.List,一个不可变的列表,以及如果在线程之间不恰当地交换(通过数据竞争)可能导致的一些令人惊讶的问题,人们没有考虑到这些问题,因为他们看到了“不可变”这个词锡,加上它们等同于“不可变 == 线程安全”,因此即使在记录“明显”线程安全方面时,保持安全也是值得的。
【讨论】:
同意@Dimitris Andreou:如果没有记录,绝对不要假设线程安全。当您努力使一个重要的类线程安全时,您希望用户知道它。
除此之外,我认为构建器最常见的用例将是线程限制的:即在某些方法中作为局部变量。如果需要多个线程来构建一个List,难道真的不可变了吗?
如果您有多个线程输入一个列表,但想在某个时候对其进行快照并说“不再进行更改,它是不可变的”,那么我会编写一些东西,从这些线程中获取元素并冻结内容当你知道它准备好了时,进入一个新的 ImmutableList。
【讨论】: