HashMap, HashTable, CurrentHashMap的區別
轉載:http://www.jianshu.com/p/c00308c32de4
HashMap vs ConcurrentHashMap
引入ConcurrentHashMap
是為了在同步集合HashTable之間有更好的選擇,HashTable
與HashMap
、ConcurrentHashMap
主要的區別在於HashMap不是同步的、線程不安全的和不適合應用於多線程並發環境下,而ConcurrentHashMap
是線程安全的集合容器,特別是在多線程和並發環境中,通常作為Map
的主要實現。除了線程安全外,他們之間還有一些細微的不同,本文會介紹到。順便說說,HashMap
和ConcurrentHashMap
還有ConcurrentHashMap
和Hashtable
兩者之間的區別在Java面試中經常出現,特別是高級Java程序員。
HashMap與ConcurrentHashMap的區別
在這部分,我們會看到更多關於HashMap
和ConcurrentHashMap
的細節和對比它們之間的參數比如線程安全、同步、性能和基本的使用。
- 就像上面所說他們之間的第一個重要的區別就是
ConcurrentHashMap
是線程安全的和在並發環境下不需要加額外的同步。雖然它不像Hashtable
那樣需要同樣的同步等級(全表鎖),但也有很多實際的用途。 - 你可以使用
Collections.synchronizedMap(HashMap)
來包裝HashMap作為同步容器,這時它的作用幾乎與Hashtable
一樣,當每次對Map
做修改操作的時候都會鎖住這個Map
對象,而ConcurrentHashMap
會基於並發的等級來划分整個Map來達到線程安全,它只會鎖操作的那一段數據而不是整個Map
都上鎖。 ConcurrentHashMap
有很好的擴展性,在多線程環境下性能方面比做了同步的HashMap
要好,但是在單線程環境下,HashMap
會比ConcurrentHashMap
好一點。
總結一下以上兩者的區別,它們在線程安全、擴展性、同步之間的區別。如果是用於緩存的話,ConcurrentHashMap
是一個更好的選擇,在Java應用中會經常用到。ConcurrentHashMap
在讀操作線程數多於寫操作線程數的情況下更勝一籌。
ConcurrentHashMap vs Hashtable vs Synchronized Map
雖然三個集合類在多線程並發應用中都是線程安全的,但是他們有一個重大的差別,就是他們各自實現線程安全的方式。Hashtable
是jdk1的一個遺棄的類,它把所有方法都加上synchronized
關鍵字來實現線程安全。所有的方法都同步這樣造成多個線程訪問效率特別低。Synchronized Map
與HashTable
差別不大,也是在並發中作類似的操作,兩者的唯一區別就是Synchronized Map
沒被遺棄,它可以通過使用Collections.synchronizedMap()
來包裝Map
作為同步容器使用。
另一方面,ConcurrentHashMap
的設計有點特別,表現在多個線程操作上。它不用做外的同步的情況下默認同時允許16個線程讀和寫這個Map容器。因為其內部的實現剝奪了鎖,使它有很好的擴展性。不像HashTable
和Synchronized Map
,ConcurrentHashMap
不需要鎖整個Map,相反它划分了多個段(segments),要操作哪一段才上鎖那段數據。
坦白說,集合類是一個最重要的Java API,我覺得恰當的使用它們是一種藝術。依我個人經驗,我會使用ArrayList
這些容器來提高自己的Java程序的性能,而不會去用一些遺棄的容器比如Vector
等等,在Java 5之前,Java集合容器有一個很致命的缺陷就是缺乏可擴展性。
同步集合類比如Hashtable
和Vector
在多線程Java應用里面逐漸成為障礙物;在jdk5后出現一些很好的並發集合,對大容量、低延遲的電子交易系統有很大影響,是快速存取數據的支柱。
</div>
<div class="postDesc">posted @ <span id="post-date">2016-11-05 21:44</span> <a href="http://www.cnblogs.com/NewMan13/">NewMan13</a> 閱讀(<span id="post_view_count">32</span>) 評論(<span id="post_comment_count">0</span>) <a href="https://i.cnblogs.com/EditPosts.aspx?postid=6034140" rel="nofollow">編輯</a> <a href="#" onclick="AddToWz(6034140);return false;">收藏</a></div>
</div>
<script type="text/javascript">var allowComments=true,cb_blogId=266946,cb_entryId=6034140,cb_blogApp=currentBlogApp,cb_blogUserGuid='c63eb72b-aed4-e511-9fc1-ac853d9f53cc',cb_entryCreatedDate='2016/11/5 21:44:00';loadViewCount(cb_entryId);</script>