Java 如果每个线程必须访问相同的阵列,则会影响性能
我有一个计算要求很高的任务,我要把它分散到多个线程上。每个线程都需要访问相同的大Java 如果每个线程必须访问相同的阵列,则会影响性能,java,multithreading,performance,memory,Java,Multithreading,Performance,Memory,我有一个计算要求很高的任务,我要把它分散到多个线程上。每个线程都需要访问相同的大字符串[][]。我想知道它们都需要访问堆上相同的String[][]这一事实是否会影响性能?为每个线程单独访问此String[][]的副本是否更好(即使它们都只需要访问此String[]][]的相同实例) 注意,对于String[][]someArray=newstring[100][1000000](例如),在任何一个时间点,他们都不可能同时调用相同的someArray[i]。通常,每个线程在任何给定的时间点都将使
字符串[][]
。我想知道它们都需要访问堆上相同的String[][]
这一事实是否会影响性能?为每个线程单独访问此String[][]
的副本是否更好(即使它们都只需要访问此String[]][]
的相同实例)
注意,对于String[][]someArray=newstring[100][1000000]
(例如),在任何一个时间点,他们都不可能同时调用相同的someArray[i]
。通常,每个线程在任何给定的时间点都将使用不同的i
。然而,有时i
在线程之间是相同的(大部分是偶然的)
每个线程在
someArray
上都是只读的,如果您只读取值,那么它应该不会有问题。即使他们读的是同一个“我”,也没关系。当您开始写入共享内存时,问题就会出现
编辑:删除了令人困惑的同步注释。当您写入“需要访问”时,您是否也需要读取或写入它?线程是否会改变数组?如果是这样,您需要考虑锁定和资源匮乏。否则JIT会缓存本地副本,如果它认为这会有帮助的话。@tilois只读。无需写入或更改任何内容。这样,您就可以安全地共享阵列的单个实例,并且不会对性能造成影响。如果可以将线程修改为使用列表而不是数组,则可以将阵列转换为列表并获得不可变列表。我没有测试过,但是我相信如果在多个线程中同时访问,那么从不可变列表访问应该会更快。如果存在同步,那么如果他们读取相同的
I
(在性能方面)是否有问题?@user2763361当然有。同步有巨大的成本,我们正在讨论的数量级。此外,如果存在同步,两个线程不能读取相同的i
,这就是关键所在。因此,您必须在已经很高的同步成本之外再加上潜在资源匮乏的成本。您无法真正同步单个阵列元素,因此这不是一个真正的问题。你要么把整件事都锁上,要么什么都不锁,在这种情况下,“我”是无关紧要的。共享只读数据不会带来任何问题。不需要同步只读数据。@nicktalbot同步单个数组元素可能没有用,但肯定不是不可能的。您只需要很多锁。@Marko Topolnik是的,可以使用其他对象