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

时间:2013-10-28 18:46:01

标签: java multithreading

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

1 个答案:

答案 0 :(得分:0)

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

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

关于线程安全的完整纲要,您应该阅读Java Memory Model或Java Concurrency In Practice一书。