我在多線程環境中的編碼,我看到線程停留在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'怎麼樣?有沒有鎖定。 。 –