我最近在代碼庫上遇到了一個類,它擴展了HashMap並同步了put方法。擴展HashMap <K,V>並只同步放入
除了它比使用ConcurrentHashMap的效率較低,可延伸的HashMap,只有同步放出現什麼樣的問題(K,V)?
假設我們不在乎get(K)是否返回最新值(例如,我們很好,線程覆蓋對方,我們不關心可能出現的競爭條件,如果該地圖本身被用作鎖)。
例子:
public class MyMap<K,V> extends HashMap<K,V> {
//...
public synchronized void put(K key, V value) {
//...
}
//...
}
據我所知,HashMap中做了重新的大小與put方法和自投放在地圖實例級同步,同時重新上漿過程中遇到的問題會(可能)不會遇到。
即使有上述可疑的假設,我的直覺告訴我可能會出現更多問題。還是我只是偏執狂?
更新:謝謝大家,這很有趣和有啓發性。如果我見過這個班級作者的原作,我現在可以詳細解釋他的愚蠢。 :)
總結: putAll仍然可怕地搞砸了數據結構,並最終在可怕的無限循環/數據競爭條件。 獲取依賴於hashmap的底層內部數據結構,這些數據結構可能正在被併發修改,導致get過程異常行爲。 這只是一個普遍不好的主意。至少,作者可以使用Collections.synchronizedMap(Map)來代替。
注:鑑於在寫這篇文章的所有三個答案其實是正確的,但我挑了約的get()爲正確答案之一,因爲它是最明顯的一個我。
但哈希表是這樣同步的。 –
哈希表完全同步(放入並獲取)。 –
所以,synched gets會讓它變得更慢 –