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

Different different threads modifying different indices of a shared list

X 不同的线程修改 X 列表的不同索引或基本上 X 是一个好的设计吗 个不同的线程修改 X 个共享对象的不同属性。我考虑过使用 synchronised/synchronizedList(任何并发数据结构),但我想避免随之而来的性能开销。该方法是否取决于 X 的值?

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

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

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

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

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

编辑:关于共享相互状态

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

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

如果您共享相互状态,您现在可以有两个线程,每个线程都可以更改另一个线程的数据。在多线程中的顺序 只要您不应用同步或锁定等机制,这种变化发生的地方和 reader 反映的变化就不是确定性的。 因此,您可以遇到像这样的经典问题:

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