1

在一个 8 核 64G EC2 实例上运行,我有一个 Java 应用程序,它的主线程在 Hashmap 中缓存了几十 GB 的数据。缓存完成后,会产生 16 个工作线程(作为 Thread 的子类)。他们收到对 Hashmap 的引用。工作线程只是读取缓存的数据,他们从不修改它。我希望所有工作线程都看到相同的缓存数据。然而事实并非如此。原来Hashmap中的数据有漏洞。对于某些键,工作线程看不到任何值。这总是发生在相同的键上!当我只产生 1 个工作线程时,一切都很好。任何想法这里出了什么问题?

4

1 回答 1

0

在线程中传递引用时,有几件事可能会出错。这是一个清单:

  • 在创建工作线程之前,HashMap 是否已经完全初始化?
  • 如果在完全写入哈希图之前创建了线程,您是否使用同步块来传递对哈希图的引用?
  • 或者,您可以使用 ConcurrentHashMap 吗?这已针对安全地从多个线程读取(和写入)进行了优化。
  • 要在工作线程启动后更改哈希映射,请确保您在同步块中更改哈希映射,并且工作线程在与第一个同步对象相同的对象上的同步块中读取映射(这是低效的,并且有更好的方法,根据您的使用情况)。

对于线程安全的完整纲要,您应该阅读 Java 内存模型或 Java 并发实践这本书。

于 2013-10-28T19:02:42.133 回答