我有一个非常大的单例对象,其中包含一个 2500 X 80000 double 组。当我尝试在多线程环境中访问它时,随着线程数量的增加,访问对象的时间也会增加。如果有办法,无论线程数如何,我都可以保持对象的访问时间相同。
我只是在读取数组。数组中没有进行任何更改。代码中没有同步
最佳答案
问题的一个可能原因是缓存无效。缓存取决于线程在有足够的其他缓存 Activity 将该行推出缓存之前返回到该行。随着线程数量的增加,线程重用一行的可能性下降。
如果可能的话,以自然顺序访问数组,第二个索引变化最快。这会尽快重用行并减少每个线程正常运行所需的缓存空间量。
一个可能的解决方案是使用例如一个信号量,用于将同时读取数组的线程数限制为提供最高吞吐量的线程数。这可能大于一,但不会是无限的。
另一种解决方案是增加处理器数量,从而增加缓存空间,与线程数量成比例。
第三种选择是使用这么多线程重新访问。拥有一个有限的线程池和一个供它们处理的任务队列可能会更有效。
关于java - 在多线程环境中访问大型单例对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17135729/