在8核64G EC2实例上运行,我有一个Java应用程序,其主要线程在Hashmap中缓存一些千兆字节的数据。缓存完成后,会生成16个工作线程(作为Thread的子类)。他们收到对Hashmap的引用。工作线程只读取缓存的数据,它们永远不会修改它。我希望所有工作线程看到相同的缓存数据。但情况并非如此。事实证明,Hashmap中的数据有漏洞。对于某些键,工作线程看不到任何值。这种情况总是发生在相同的键上!当我只生成一个工作线程时,一切都很好。任何想法在这里出了什么问题?
答案 0 :(得分:0)
在线程周围传递引用时,有几件事可能会出错。这是一份清单:
关于线程安全的完整纲要,您应该阅读Java Memory Model或Java Concurrency In Practice一书。