对来自多个 Java 线程的缓存数据的只读访问



在 8 核 64G EC2 实例上运行,我有一个 Java 应用程序,其主线程在哈希图中缓存了一些千兆字节的数据。缓存完成后,将生成 16 个工作线程(是 Thread 的子类)。他们收到对哈希图的引用。工作线程只是读取缓存的数据,它们从不修改它。我希望所有工作线程都看到相同的缓存数据。然而,事实并非如此。事实证明,哈希图中的数据有漏洞。对于某些键,工作线程看不到任何值。对于相同的密钥,这种情况总是发生!当我只生成 1 个工作线程时,一切都很好。知道这里出了什么问题吗?

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

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

有关线程安全的完整概述,您应该阅读 Java 内存模型或 Java 并发实践手册。

最新更新