Java如何管理对阵列元素的多线程访问?
程序员大家好.我已经问了one question,但是尽管我得到了非常好的答案,但我无法解决我的问题. 我怀疑这种缓慢的并行处理是由于上下文切换造成的.或者可能是由于常见对象的“自动”同步.我想你可以帮我理解发生了什么. 让我说明一下我的情况:我正在制定一个科学计算程序.它不依赖于外部事物,只取决于我在开始时给它的输入值. 这样,我的主类中有几个双数组,如双y [Ns] [N]或phiS [Ns] [Nord] [N],其中N和Nord是程序的其他固定大小. 因此,不是为(int i = 0; i< Ns;< i)设置循环了,而是将这个计算任务划分为Runnable批处理,每个批处理在一个较小的区间内:for(int i = start; i< end; i),其中开始和结束总是在0和Ns之间.例如,如果我在双核PC上,我做两个批次,一个用start = 0和end = Ns / 2,另一个用start = Ns / 2和end = Ns.如果我在四核上,第二批将有start = Ns / 4到end = Ns / 2,依此类推(假设在每种情况下除法都是精确的). 每个Batch,作为实现Runnable的类,存储在ArrayList< Batch>中.并给予一个大小等于核心数的FixedThreadPool.它执行批处理并等待它们使用简单的CountDown方案完成. 每个批次都需要从程序的主类访问那些数组上的数据,但是它们的访问权限是每个批次只从yS [start] []到yS [end] []读取,因此两个批次永远不会尝试读取相同的数组元素.我想知道Java是否仍然锁定了yS,即使每个批次都没有尝试访问与其他元素相同的元素. 我想知道我的问题是否与上下文切换引起的开销有关,因为每个批处理需要处理数千个双打,并且如果构建程序的方式会影响它. 也许我应该找到一种方法来传递给每个批次只是与它相关的数组的元素,但我不知道如何处理它.如果有指针,我可以使用简单的指针操作获得所需元素的新数组,而无需重新分配任何内容.有没有办法在Java中做这样的事情? 好吧,最后,还要提一下:有一部分代码需要同步(它处理其他数组)并且它已经正常工作. 总而言之,问题是:为什么我没有获得多线程,当我期待的时候? 我刚刚在这里运行了几次简单的串行和多线程程序,串行程序为14500 ms,多线程程序为15651 ms.两者都在同一个双核心. 非常感谢您的关注. 最佳答案
您可能正在运行的一种可能是线程在缓存线上颠簸.如果不同的线程快速写入同一缓存行中的位置(例如,在同一阵列中关闭),则硬件具有高通信开销,确保数据保持一致.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |