我知道您必须围绕任何会改变哈希图结构(放置或删除)的东西进行同步,但在我看来,您还必须围绕哈希图的读取同步,否则您可能正在阅读,而另一个线程正在改变结构哈希图。
所以我同步gets和puts到我的hashmap。我可以用来测试的唯一机器只有一个处理器,所以在系统投入生产并开始出现故障之前,我从来没有任何真正的并发。我的哈希图中缺少项目。我认为这是因为两个线程同时写入,但根据下面的代码,这应该是不可能的。当我将线程数减少到 1 时,它开始完美地工作,所以这绝对是一个线程问题。
细节:
// something for all the threads to sync on
private static Object EMREPORTONE = new Object();
synchronized (EMREPORTONE)
{
reportdatacache.put("name.." + eri.recip_map_id, eri.name);
reportdatacache.put("subjec" + eri.recip_map_id, eri.subject);
etc...
}
……和其他地方……
synchronized (EMREPORTONE)
{
eri.name = (String)reportdatacache.get("name.." + eri.recip_map_id);
eri.subject = (String)reportdatacache.get("subjec" + eri.recip_map_id);
etc...
}
就是这样。我在函数之间传递reportdatacache,但这只是对哈希图的引用。
另一个重要的一点是,它在应用服务器中作为 servlet 运行(具体来说是 iplanet,但我知道你们中没有人听说过)
但无论如何,EMREPORTONE 对于网络服务器进程来说是全局的,没有两个线程应该能够互相踩踏,但我的 hashmap 却被破坏了。有什么想法吗?