sync.map

image.png

mu是在阻塞操作時加的鎖;
read和dirty是兩個map啸如,可以把read理解為dirty的緩存(之后會詳解sync.map中的讀操作),且需要注意read和dirty中存儲的value都是指針;
misses是一個int值掀序,用于記錄在read中沒有讀到但在dirty中存在的值的次數(shù)(緩存未命中)且在misses值到一個閾值之后會發(fā)生一次dirty轉(zhuǎn)換為read(后面簡稱dr轉(zhuǎn)換)爹脾;

image.png

Load方法比較簡單,用于從map中獲取對應(yīng)key的value坡疼,主要邏輯是先從read中查找key彬呻,如果read中沒有找到,再去dirty中找柄瑰,并調(diào)用missLocked方法使misses值加一闸氮,missLocked方法中如果misses值大于dirty的長度后,會進(jìn)行一次dr轉(zhuǎn)換教沾。

image.png

注意:
a.這里用到了加鎖雙重檢查蒲跨,具體原因后面再解釋,sync.Map中很多地方都用了這個授翻。
b.amended是一個bool值或悲,當(dāng)dirty中有read中沒有的kv對時為true,只有在dr轉(zhuǎn)換發(fā)生后且沒有新的kv store進(jìn)來堪唐,dirty為nil巡语,才會為false

然后是Store方法,用于存儲kv

image.png

在調(diào)用Store方法時有兩種情況淮菠,一種是新增kv捌臊,一種是替換一個key的舊value值。如果是進(jìn)行值的替換兜材,sync.Map在進(jìn)行值的替換的時候理澎,先是直接在read中進(jìn)行替換,因為前面說過read和dirty中存儲的都是指針曙寡,所以在read中替換值糠爬,dirty也是可見的。如果替換失斁偈(該key在read中的value為expunged)或是read中沒有找到這個key烈评,則進(jìn)入下面的邏輯琳轿。首先如果確定該key在read中的value為expunged簇爆,則重新在dirty新增該kv硕糊,并將v進(jìn)行替換;如果是在read中沒有這個key蕊唐,但dirty中有屋摔,說明這個kv是新增到dirty的且之后未發(fā)生dr轉(zhuǎn)換,此時在dirty中對舊v進(jìn)行替換替梨;如果dirty中也沒有這個kv钓试,先判斷是否剛進(jìn)行過一次dr轉(zhuǎn)換(判斷amended的值)装黑,如果是則調(diào)用dirtylocked方法,然后在dirty中新增kv

image.png
image.png

dirtylocked方法將read中的v不為nil的kv復(fù)制到dirty中弓熏,read為nil的kv(后面可以知道這是被delete掉的kv)則將v設(shè)置為expunged恋谭,在下次dr轉(zhuǎn)換時即被永久刪除。

最后再看看Delete方法挽鞠,調(diào)用Delete后先看在read中是否有該kv疚颊,如果有,就調(diào)用e.delete方法進(jìn)行刪除信认,如果沒有再看dirty中是否存在該kv材义,如果有則用golang的delete方法從dirty中刪除

image.png

e.delete方法是是惰性刪除,調(diào)用后將read中該kv的v設(shè)置為nil狮杨。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市到忽,隨后出現(xiàn)的幾起案子橄教,更是在濱河造成了極大的恐慌,老刑警劉巖喘漏,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件护蝶,死亡現(xiàn)場離奇詭異,居然都是意外死亡翩迈,警方通過查閱死者的電腦和手機持灰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來负饲,“玉大人堤魁,你說我怎么就攤上這事》凳” “怎么了妥泉?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長洞坑。 經(jīng)常有香客問我盲链,道長,這世上最難降的妖魔是什么迟杂? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任刽沾,我火速辦了婚禮,結(jié)果婚禮上排拷,老公的妹妹穿的比我還像新娘侧漓。我一直安慰自己,他們只是感情好监氢,可當(dāng)我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布火架。 她就那樣靜靜地躺著鉴象,像睡著了一般。 火紅的嫁衣襯著肌膚如雪何鸡。 梳的紋絲不亂的頭發(fā)上纺弊,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天,我揣著相機與錄音骡男,去河邊找鬼淆游。 笑死,一個胖子當(dāng)著我的面吹牛隔盛,可吹牛的內(nèi)容都是我干的犹菱。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼吮炕,長吁一口氣:“原來是場噩夢啊……” “哼腊脱!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起龙亲,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤陕凹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后鳄炉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體杜耙,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年拂盯,在試婚紗的時候發(fā)現(xiàn)自己被綠了佑女。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡谈竿,死狀恐怖团驱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情空凸,我是刑警寧澤店茶,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站劫恒,受9級特大地震影響贩幻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜两嘴,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一丛楚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧憔辫,春花似錦趣些、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拢操。三九已至,卻和暖如春舶替,著一層夾襖步出監(jiān)牢的瞬間令境,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工顾瞪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留舔庶,地道東北人。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓陈醒,卻偏偏與公主長得像惕橙,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子钉跷,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容

  • 偶然看見這么篇文章:一道并發(fā)和鎖的golang面試題弥鹦。 雖然年代久遠(yuǎn),但也稍有興趣爷辙。 正好最近也看到了 sync....
    一塊牛排閱讀 1,857評論 0 1
  • Go 語言原生 map 并不是線程安全的彬坏,對它進(jìn)行并發(fā)讀寫操作的時候,需要加鎖犬钢。而 sync.map 則是一種并發(fā)...
    雪上霜閱讀 1,205評論 0 0
  • 前言 前面苍鲜,我們講了map的用法以及原理Golang中map的實現(xiàn)原理[https://blog.csdn.net...
    書生也愛羊閱讀 2,433評論 0 1
  • map map的底層實現(xiàn) golang中的map采用了HashTable的實現(xiàn)思灰,通過數(shù)組+鏈表實現(xiàn)的玷犹。一個哈希表會...
    xixisuli閱讀 3,727評論 0 1
  • 介紹 sync.Map是go官方實現(xiàn)的一個thread safe的map, 適合讀多寫少的場景 數(shù)據(jù)結(jié)構(gòu) Load...
    algebra2k閱讀 505評論 0 0