java - 在多线程环境中访问大型单例对象

标签 java multithreading singleton

我有一个非常大的单例对象,其中包含一个 2500 X 80000 double 组。当我尝试在多线程环境中访问它时,随着线程数量的增加,访问对象的时间也会增加。如果有办法,无论线程数如何,我都可以保持对象的访问时间相同。

我只是在读取数组。数组中没有进行任何更改。代码中没有同步

最佳答案

问题的一个可能原因是缓存无效。缓存取决于线程在有足够的其他缓存 Activity 将该行推出缓存之前返回到该行。随着线程数量的增加,线程重用一行的可能性下降。

如果可能的话,以自然顺序访问数组,第二个索引变化最快。这会尽快重用行并减少每个线程正常运行所需的缓存空间量。

一个可能的解决方案是使用例如一个信号量,用于将同时读取数组的线程数限制为提供最高吞吐量的线程数。这可能大于一,但不会是无限的。

另一种解决方案是增加处理器数量,从而增加缓存空间,与线程数量成比例。

第三种选择是使用这么多线程重新访问。拥有一个有限的线程池和一个供它们处理的任务队列可能会更有效。

关于java - 在多线程环境中访问大型单例对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17135729/

相关文章:

java - key 'string1-string2' 的重复条目 'PRIMARY'

Java - 数组类型到对象类型的转换

c# - 同步线程协程

c++ - 单例实例声明为 GetInstance 方法的静态变量,它是线程安全的吗?

c# - MonoState、Singleton 或派生形式 : Best approach for CRUD app?

java - JsonObject 构建 Stackoverflow 错误

java - 字符串连接和内存泄漏

java - 如何使用现有基类对象构造派生类

c++ - 返回 protected 数据时如何使用lock_guard

php - Codeigniter : Why assign it to a variable? 中的 get_instance()