map
採用了陣列加鍊表的方式儲存(橫向陣列,縱向鍊錶),當有同一hash值得資料會被房到同意陣列後面形成鍊錶
hashmap(預設16長度)
put
int hash =
hash
(key)
; 獲取hash值
int i =
indexfor
(hash, table.length)
; tab[hash&
(n-1
)]返回map table索引位置(為了解決均勻雜湊索引)
迴圈遍歷鍊錶,如果當前entry hash值與key跟傳入的key相等則將新值賦值給舊值,返回舊值
否則建立新的entry,並將空的tab[hash&
(n-1
)]賦值給entry.next
get
<1>
計算hash值
<2>
遍歷鍊錶,根據int i =
indexfor
(hash, table.length)
;map table陣列索引值位置
hashtable(預設11長度)
hashtable使用了synchronized進行加鎖
int hash = hash(key);獲取該key的雜湊值
int index = (hash & 0x7fffffff) % tab.length; 獲取該key在table陣列的索引下標,得到該索引下的鍊錶
concurrenthashmap(預設16長度的segment(段),16個併發)
初始化:預設初始化16段(segment),16個併發數,在第一段初始化長度為2的hashentry陣列(主要作用是儲存第一次初始化的時候的引數如:長度,擴充套件閾值)
在操作put與get的時候使用了unsafe非阻塞同步機制(基於硬體級別的cas演算法),segment操作時會經過兩次hash運算,
第一次hash:(hash(key) >>> segmentshift(28)) & segmentmask(15)得到segment的位置
第二次hash是用第一次hash值的基礎上(tab.length - 1) & hash得到hashentry陣列的索引,從而得到鍊錶
concurrenthashmap結構為先分為16個segment段,在每個segment再已橫向hashentry陣列,再縱向鍊錶的形式儲存資料,
操作是採用reentrantlock鎖住乙個segment裡面hashentry,保證執行緒安全而不會鎖住整個map
put操作
先獲取key的hash值計算該key在segment位置
Redis主從配置和底層實現原理解析 實戰記錄
我們使用redis的時候往往都是主從模式或者集群架構,不會使用單台redis服務。我們使用master節點寫輸入,然後將資料同步到sl e節點,從節點可以提供讀取或者備份的功能,分擔master節點壓力。redis主從架構搭建,配置從節點步驟 1 複製乙份redis.conf檔案為redis 638...
redis深度理解底層鎖原理
redis的鎖分別有incr setnx set,那麼我們就開始來談談他們的用法和場景吧!1.incr 計時器,1操作 a 語法 incr key b 場景 1 控制api 1秒內的多次訪問 2 記錄使用者每天訪問 的登入次數 c 為何我們說這個怎麼能算鎖呢,當然,單獨它肯定是算不了鎖的,因為它本身...
深入理解springmvc 底層原理
深入理解springmvc 底層原理 web.xml 檔案中的配置 dispatcherservlet springmvc執行流程 springmvc 一切請求的入口 dispatcherservlet 對映處理器 對映 key value 作用 根據請求 url 找到乙個 method handl...