【发布时间】:2013-10-28 18:46:01
【问题描述】:
在一个 8 核 64G EC2 实例上运行,我有一个 Java 应用程序,它的主线程在一个 Hashmap 中缓存了几十 GB 的数据。缓存完成后,会产生 16 个工作线程(作为 Thread 的子类)。他们收到对 Hashmap 的引用。工作线程只是读取缓存的数据,他们从不修改它。我希望所有工作线程都看到相同的缓存数据。然而事实并非如此。原来Hashmap中的数据有漏洞。对于某些键,工作线程看不到任何值。这总是发生在相同的键上!当我只产生 1 个工作线程时,一切都很好。有什么想法吗?
【问题讨论】:
-
你是说 hashmap 仅在创建访问它的线程之前被修改?
-
你的几十G的地图是怎么生成的?是单线程,是从磁盘读取的吗?
-
是的,hashmap 仅在创建工作线程之前被修改。哈希图是在单个(主)线程中从磁盘创建的。更准确地说,hashmap 的值是对象,缓存的数据存储在 THashMap 对这些对象的私有中。
标签: java multithreading