让 X 不同的线程修改 X 列表的不同索引或基本上 X 修改的不同线程是一个好的设计X 共享对象的不同属性。我考虑过使用 synchronized / synchronisedList (任何并发数据结构),但我想避免它带来的性能开销。该方法是否取决于 X 的值?
根据this,添加到单个arraylist的多个线程可能有用,但它不是一个好设计,它是否与此相同?
如果答案因语言而异,我特别询问JAVA,但是想知道为什么不同的语言有不同的含义。
答案 0 :(得分:2)
如果我们假设你的列表有一个固定的初始大小,让我们说10个元素,并且你有10个线程操纵元素1到10,那么就没有涉及共享的共同状态(参见shared mutual state is the root of all evil)。因此,我认为同步没有大问题,并且会与列表一起使用。
但是,请记住,这严重依赖于所执行的操作和列表的大小。如果列表中有1000000个元素,那么创建1000000个线程将效率低下甚至不可能。
此外,只要您开始添加和删除列表中的元素,您就会将列表本身作为共享的共享状态,现在您必须担心同步。
编辑:关于共享互助状态
如果您共享的状态不是共同的,则不会出现同步问题,因为无论如何都无法更改数据。
如果您有共享的共享状态,则可以更改状态,但除了您当前的代码之外的任何人都无论如何都可以使用该状态, 因此,更改会直接反映在您的代码中。
如果你有共享的共同状态,你现在可以拥有两个线程,每个线程都可以更改另一个线程的数据。在多线程中的顺序 只要您不应用同步或锁定等机制,这种变化就会发生并且读者反映的不是确定性的。 因此,您可以遇到以下经典问题: