代码之家  ›  专栏  ›  技术社区  ›  SHB

不同的线程修改共享列表的不同索引

  •  4
  • SHB  · 技术社区  · 7 年前

    设计得好吗 十、 不同线程修改 十、 列表的不同索引或基本 十、 不同线程修改 十、 共享对象的不同属性。我考虑过使用 已同步 / 同步列表 (任何并发数据结构)但我希望避免随之而来的性能开销。方法是否取决于 十、 ?

    根据 this 将多个线程添加到单个arraylist可能可行,但这不是一个好的设计,是否与此相同?

    如果答案因语言而异,我会特别询问JAVA,但我想知道为什么不同的语言有不同的答案。

    1 回复  |  直到 7 年前
        1
  •  2
  •   lwi    7 年前

    如果我们假设您的列表有一个固定的初始大小,比如10个元素,并且您有10个线程操作元素1到10,那么不涉及共享的相互状态(请参阅 shared mutual state is the root of all evil )。因此,我认为同步没有什么大问题,我将使用这个列表。

    但是,请记住,这在很大程度上取决于所执行的操作和列表的大小。如果列表中有1000000个元素,那么创建1000000个线程将效率低下,甚至不可能。

    此外,一旦开始从列表中添加和删除元素,列表本身就是共享的相互状态,现在必须担心同步问题。

    编辑:关于共享的相互状态

    如果共享的状态不是相互的,则不会出现同步问题,因为任何人都无法更改数据。

    如果您有未共享的相互状态,您可以更改该状态,但除当前代码外,任何人都无法在该状态上工作, 因此,更改直接反映在代码中。

    如果您共享了相互状态,那么现在可以有两个线程,每个线程都可以更改另一个线程的数据。在多线程中 在这种情况下,只要不应用同步或锁定等机制,就会发生这种更改,并且读取器反映的不是确定性的。 因此,您可以遇到以下经典问题:

    • A从元素x读取数据并进行转换。
    • B从元素x读取数据并对其进行转换<--A尚未写入其更改,因此B使用过时的数据
    • A将数据写入元素x
    • B写入 数据到元素x<--A的更改丢失
    推荐文章