.以及JDK1.5ConcurrentHashMap新特性
一、HashMap和Hashtable的區別
先看2個類的定義
結論:可見Hashtable 繼承自 Dictiionary 而 HashMap繼承自AbstractMap
Hashtable的put方法如下:
注意1 方法是同步的
注意2 方法不允許value==null
注意3 方法調用了key的hashCode方法,如果key==null,會拋出空指針異常 HashMap的put方法如下
HashMap的put方法如下:
注意1 方法是非同步的
注意2 方法允許key==null
注意3 方法并沒有對value進行任何調用,所以允許為null
總結:
HashMap允許將null作為一個entry的key或者value,而Hashtable不允許。
最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多個線程訪問Hashtable時,不需要自己為它的方法實現同步,而HashMap?就必須為之提供外同步(Collections.synchronizedMap)。
二、ConcurrentHashMap新特性
ConcurrentHashMap出現問題原因:HashMap不是線程安全的,因此多線程操作時需要格外小心。
ConcurrentHashMap新特性:效率比Hashtable高,并發性比hashmap好。結合了兩者的特點。
ConcurrentHashMap如何實現線程安全:
從ConcurrentHashMap代碼中可以看出,它引入了一個“分段鎖”的概念,具體可以理解為把一個大的Map拆分成N個小的HashTable,根據key.hashCode()來決定把key放到哪個HashTable中。
在ConcurrentHashMap中,就是把Map分成了N個Segment,put和get的時候,都是現根據key.hashCode()算出放到哪個Segment中。
?ConcurrentHashMap中主要實體類就是三個:ConcurrentHashMap(整個Hash表),Segment(桶),HashEntry(節點)。
?get 方法:
?
put方法put 操作一上來就鎖定了整個segment,這當然是為了并發的安全,修改數據是不能并發進行的。
segment里面才是真正的hashtable,即每個segment是一個傳統意義上的hashtable。
remove方法:remove 操作非常類似put
三、知識點掃盲
1. hashcode()和eaquals()區別
一般來講,equals方法是給用戶調用的,如果你想判斷2個對象是否相等,你可以重寫equals方法,然后在代碼中調用,就可以判斷他們是否相等了。簡單來講,equals方法主要是用來判斷從表面上看或者從內容上看,2個對象是不是相等。舉個例子,有個學生類,屬性只有姓名和性別,那么我們可以認為只要姓名和性別相等,那么就說這2個對象是相等的。
hashcode方法一般用戶不會去調用,比如在hashmap中,由于key是不可以重復的,他在判斷key是不是重復的時候就判斷了hashcode這個方法,而且也用到了equals方法。這里不可以重復是說equals和hashcode只要有一個不等就可以了!所以簡單來講,hashcode相當于是一個對象的編碼,就好像文件中的md5,他和equals不同就在于他返回的是int型的,比較起來不直觀。我們一般在覆蓋equals的同時也要覆蓋hashcode,讓他們的邏輯一致。舉個例子,還是剛剛的例子,如果姓名和性別相等就算2個對象相等的話,那么hashcode的方法也要返回姓名的hashcode值加上性別的hashcode值,這樣從邏輯上,他們就一致了。
2.關鍵字volatite?
Java 語言提供了一種稍弱的同步機制,即 volatile 變量.用來確保將變量的更新操作通知到其他線程,保證了新值能立即同步到主內存,以及每次使用前立即從主內存刷新. 當把變量聲明為volatile類型后,編譯器與運行時都會注意到這個變量是共享的.
volatile 變量對所有線程是立即可見的,對 volatile 變量所有的寫操作都能立即反應到其他線程之中,換句話說:volatile 變量在各個線程中是一致的,所以基于 volatile 變量的運算是線程安全的.?
四、 參考來源
1.?http://blog.csdn.net/shohokuf/article/details/3932967
2.?http://blog.csdn.net/wl_ldy/article/details/7228127
3.?http://blog.csdn.net/xuefeng0707/article/details/40834595
4.?http://www.cnblogs.com/yakun/p/3589437.html
?
轉載于:https://www.cnblogs.com/xumaodun/p/4915634.html
總結
以上是生活随笔為你收集整理的.以及JDK1.5ConcurrentHashMap新特性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 参加对越防御战人员退役后档案袋里没有参战
- 下一篇: 有关于军官实事求是成语故事吗