2014-12-22 65 views
2

我是Java和stackoverflow的新手,並且正在從Collections Framework開發人員的經驗豐富的人員尋求答案。ConcurrentHashMap和哈希表的區別

我讀到hashTable是線程安全的,concurrentHashMap也是如此,但concurrentHashMap比hashTable快,因爲它將地圖段鎖定到訪問線程。

這是如何在內部工作的?細分市場的規模如何決定?示例:如果concurrentHashMap中有40個條目,並且有3個線程試圖檢索/修改數據,那麼將如何確定這些分段?

任何圖像/解釋/代碼在這將真的很棒。提前致謝。

+0

基本上ConcurrentHashMap具有更好的性能,因爲使用CAS操作實現而不是鎖定會導致許多上下文切換和等待。 – Maxim

+0

這是一篇關於ConcurrentHashMap的優秀文章:http://www.burnison.ca/articles/the-concurrency-of-concurrenthashmap –

+0

謝謝,這真的有幫助。不知道爲什麼它被標記爲重複,因爲另一個問題是「HashMap和HashTable之間的區別」 – Kay

回答

-1

concurrentHashMap - 鎖定自由算法。讀或寫操作之間沒有同步。 作爲每Java文檔

的哈希表支持更新檢索的完全併發和可調 預期的併發性。該類遵循與Hashtable相同的功能 規範,並且包括與Hashtable的每種方法對應的方法 的版本。但是,即使所有 操作都是線程安全的,但檢索操作不會導致鎖定,並且也不支持以防止所有訪問的方式鎖定整個表的 。這個類與 Hashtable在依賴其線程安全性的程序中完全可互操作,但不依賴其 同步細節。

HashTable - 一切都是同步的。它在讀和寫操作之間完全同步

+0

謝謝Siva。 「檢索操作不需要鎖定」,這意味着寫操作會鎖定段? 「沒有任何支持以阻止所有訪問的方式鎖定整個表」這一行表明某些部分被鎖定,但不是整個表。你能否解釋一下,如果在任何時候通過表/段上的線程獲得鎖? – Kay

+1

ConcurrentHashMap' * not * lock-free。 –

+0

Steven是對的,CHM肯定不是***無鎖。 ConcurrentLinkedQueue是無鎖的,但CHM使用分段鎖。 –