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