Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果每个线程必须访问相同的阵列,则会影响性能_Java_Multithreading_Performance_Memory - Fatal编程技术网

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是的,可以使用其他对象