摘要:和的區別和的區別是,在操作的方法上加入關鍵字,使得線程安全。使用進行比較,或者傳入的比較器。基于,它自己的任務主要是維護保持順序的雙向鏈表。和的區別提供了一個高效的線程安全的訪問和更新的方式。在中的過程和類似。
HashTable和HashMap的區別
HashTable和HashMap的區別是,HashTable在操作table的方法上加入synchronized關鍵字,使得線程安全。實現方式和HashMap類似,但是HashTable沒有處理在某個槽下的值太多,鏈表過長的情況。
TreeMap和HashMap的區別有序,二叉搜索樹,使用紅黑樹。使用key進行比較,或者傳入的比較器。方法containsKey、get、put和remove的時間復雜度是log(n)。
LinkedHashMap與HashMap的區別LinkedHashMap保存了元素的插入順序,在遍歷時會遵循插入的順序。而HashMap遍歷時,順序是按照table的順序,依次遍歷每一個槽中的鏈表,所以順序和插入順序完全不同。
LinkedHashMap在Node上加上了before和after屬性用以構建保持原順序的雙向鏈表。
LinkeHashMap可以設置參數,使其從插入順序變為訪問順序。
LinkedHashMap基于HashMap,它自己的任務主要是維護保持順序的雙向鏈表。
ConcurrentHashMap ConcurrentHashMap和HashMap的區別java.util.concurrent;
ConcurrentHashMap提供了一個高效的、線程安全的訪問和更新HashMap的方式。較之HashTable,它沒有提供在整個table上的鎖,同步方式粒度更細。
如何實現并發訪問的安全看網上資料,舊版本的ConcurrentHashMap采用了分段的策略進行同步。Hash步驟如下:
ConcurrentHashMap維護了一個segment數組,segment是一個鎖。
將key先hash到segment位置,每個segment存儲了一個真正的table。
再次hash,找到在table中的位置。
在table中的過程和HashMap類似。
所有并發訪問ConcurrentHashMap的線程會在每個segment上同步,所以線程可以并行的訪問不同的segment,減小了同步的粒度。
但是,在1.8中,使用的是sun.misc.Unsafe工具。它的作用有:
對變量和數組內容的原子訪問,自定義內存屏障
對序列化的支持
自定義內存管理/高效的內存布局
與原生代碼和其他JVM進行互操作
對高級鎖的支持
ConcurrentHashMap對table的操作全部由sun.misc.Unsafe來完成:
static finalNode tabAt(Node [] tab, int i) { return (Node )U.getObjectVolatile(tab, ((long)i << ASHIFT) + ABASE); } static final boolean casTabAt(Node [] tab, int i, Node c, Node v) { //c表示舊值 //v表示新值 //更新前會驗證舊值是否變化,如果變化說明期間被其它線程修改,則修改失敗 //外部使用該方法一般會使用一個循環,以多次重試 return U.compareAndSwapObject(tab, ((long)i << ASHIFT) + ABASE, c, v); } static final void setTabAt(Node [] tab, int i, Node v) { U.putObjectVolatile(tab, ((long)i << ASHIFT) + ABASE, v); }
可以簡單的理解為上述方法是原子性的,對目標數據所在的內存位置進行了加鎖,整個操作過程中,對該部分內存的讀、寫不會受其它線程的影響。可見,該方法的并發實現粒度更細。
還有一點需要注意,在并發操作時,可能會出現有的線程開始擴張或縮小table,但是有的線程卻試圖操作table的情況。因為搬遷table上元素的過程比較耗時,所以,其它線程發現該table正在重建,會先將操作table的事情往后放一放,而是轉頭去幫助搬遷table,等table搬遷完畢再繼續自己的活。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/67915.html
摘要:說到復盤基礎,并不是所有的都會復盤,沒那個時間更沒那個必要。比如,一些基礎的語法以及條件語句,極度簡單。思前想后,我覺得整個計劃應該從集合開始,而復盤的方式就是讀源碼。通常,隊列不允許隨機訪問隊列中的元素。 ?showImg(https://segmentfault.com/img/remote/1460000020029737?w=1080&h=711); 老讀者都知道,我是自學轉行...
摘要:的值是在上述方法中處理過的值,通過與當前容量進行,直接獲取到哈希表的位置。策略二,如果已經很大了,擴容已經不可取,那么就采用紅黑樹結構轉化鏈表。紅黑樹的創建不再詳述。紅黑樹的根就是中第一個節點。 java.util.Map Map中的自我引用 需要小心用易變的對象作為Map的key,這會導致Map的行為無法預測。Map也不可以將自己作為key,可以作為value,但是會導致equals...
摘要:抓住了迭代器模式的本質,即是迭代,賦予了它極高的地位。輸出結果輸出結果小結迭代器模式幾乎是種設計模式中最常用的設計模式,本文主要介紹了是如何運用迭代器模式,并介紹了模塊生成迭代器的種方法,以及種生成迭代器的內置方法。 showImg(https://segmentfault.com/img/bVbmv7W?w=4272&h=2848); 在軟件開發領域中,人們經常會用到這一個概念——設...
閱讀 1633·2023-04-25 16:29
閱讀 957·2021-11-15 11:38
閱讀 2295·2021-09-23 11:45
閱讀 1424·2021-09-22 16:03
閱讀 2541·2019-08-30 15:54
閱讀 1204·2019-08-30 10:53
閱讀 2603·2019-08-29 15:24
閱讀 1104·2019-08-26 12:25