を入れて、私はスレッドがHashMap.put
上で立ち往生している参照してください。HashMapのは、上の立ち往生、私は、マルチスレッド環境でコーディングしています
34 Threads
java.util.HashMap.put(HashMap.java:374)
com.aaa.bbb.MyClass.getDefinitionMap().
はHashMap
が、私は方法が同期されていることを見ている方法を調査:
@Override
public synchronized Map<String,String> getDefinitionMap() {
//truncated some code here...
colDefMap = new HashMap<String,String>();
for (CD cd : (List<CD>)cm.getDef()) {
colDefMap.put(cd.getIdentifier(),cd);
}
return colDefMap;
}
ConcurrentHashMap
に切り替えた後、メソッドのシグネチャからsynchronizedキーワードを削除し、アプリケーションサーバーを再起動すると問題が解決します。
私の質問は、このシナリオで同時アクセスからマップを保護するには同期メソッドでは十分ではないのですか?
[mcve]なしでは非常にわかりにくいです。あなたのequals/hashCodeメソッドは同期されているものを呼び出します。デッドロックが発生する可能性がありますか? –
あなたは正確にアクセスを同期していますか?このメソッドで 'HashMap'を作成しているので、このメソッドが別のスレッドのマップに干渉するリスクはありません。共有状態へのアクセスを同期する必要があるだけなので、 'cm'へのアクセスを同期させる必要がありますか? – Samuel
おそらくどこかでデッドロックが発生する可能性があります。あなたは、また、同期呼び出しを持つかもしれないあなたのすべてのメソッドをチェックする必要があります。確かに知るには十分なコードがありません。しかし、そのクラスに他のメソッドが同期されているのであれば、私は興味があります。 'cm'はどうですか?そこにはロックがありますか? 。 –