代码之家  ›  专栏  ›  技术社区  ›  Brian Harris

guava的不可变列表.builder线程安全吗?

  •  11
  • Brian Harris  · 技术社区  · 15 年前

    guava的不变列表builder的线程安全保证是什么?javadocs不会说。

    3 回复  |  直到 14 年前
        1
  •  31
  •   Jared Levy    15 年前

    虽然guava不可变类是threadsafe,但它们的构建者不是。对于大多数应用程序,只有一个线程将与任何特定的生成器实例交互。

    虽然通常不需要记录线程安全性的缺失,但是对于不变的集合构建者来说,这样的javadoc可能是有意义的。人们可能会惊讶于不可变列表是线程安全的,而不可变列表是线程安全的。

        2
  •  13
  •   Dimitris Andreou    15 年前

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

    更严重的是,“不”。

    我也更喜欢不可变列表的javadocs,朋友们也包括这样一个非常明显的,是的评论(这样你就不必自己假设了),因为“明显”并不总是如此。就在前几天我在讨论 scala.List 如果在线程之间不适当地交换(通过数据竞争),可能会导致一些令人惊讶的问题,因为人们在tin上看到“不可变”这个词而没有考虑这些问题,加上它们等同于“不可变==线程安全”,所以即使在记录“明显”的线程安全方面,也要注意安全。

        3
  •  2
  •   AdamFlyr    14 年前

    同意@dimitris andreou:如果没有这样的记录,绝对不要假设线程安全。当你努力做一个非平凡的类线程安全时,你 希望 用户了解它。

    除此之外,我认为构建器最常见的用例是线程受限的:即在某些方法中作为局部变量。如果您需要多个线程来构建一个列表,那么它是否真的是不可变的?

    如果有多个线程进入一个列表,但希望在某个时刻快照它,并说“以后不再更改,它是不可变的”,那么我将编写一些东西,从这些线程中提取元素,并在您知道它已经就绪时将内容冻结到一个新的不可变的列表中。

    推荐文章