ハッシュマップの構造を変更するもの(配置または削除)を同期する必要があることは知っていますが、ハッシュマップの読み取りも同期する必要があるようです。そうしないと、別のスレッドが構造を変更している間に読んでいる可能性がありますハッシュマップ。
そのため、gets と put をハッシュマップに同期します。私がテストできる唯一のマシンは、すべて 1 つのプロセッサしか搭載していないため、システムが稼働して障害が発生し始めるまで、実際の同時実行性はありませんでした。ハッシュマップにアイテムがありませんでした。これは、2 つのスレッドが同時に書き込みを行っていたためだと思いますが、以下のコードに基づくと、これは不可能なはずです。スレッドの数を 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 を渡しますが、それはハッシュマップへの参照にすぎません。
もう 1 つの重要な点は、これが appserver でサーブレットとして実行されていることです (具体的には iplanet ですが、誰も聞いたことがないことは知っています)。
しかし、とにかく、EMREPORTONE は Web サーバー プロセスに対してグローバルであり、2 つのスレッドが互いに踏み込むことはできませんが、私のハッシュマップは壊れています。何かご意見は?