此源碼理解僅為個人理解,如有錯誤歡迎指出
sync.map的數據結構主要包含四個字段
一個互斥鎖,readonly,dirty,和miss
從讀寫兩個方面來講這幾個變量
readonly其實就是有bool值的dirty,底層結構都是map
readonly的讀更新不會上鎖,dirty的讀寫都是需要上鎖的
在讀map的時候,會先讀readonly,如果不存在就會上鎖去讀dirty,此時miss++
在寫map的時候,也會先判斷在readonly中是否存在,如果存在就直接更新,此時其實有個判斷
如果read中的變量一開始存在,但是被刪除后,他是一個expunged的狀態,此時是需要寫dirty的,這個狀態其實也會被判斷在readonly中存在
如果readonly中不存在,就會去判斷在dirty是否存在,存在的話直接更新dirty,不然的話就是新建dirty
總的來說就是先找readonly中的數據,有的就直接讀寫,沒有就去找dirty。并且每次從readonly讀不到數據但是dirty讀到了,就會miss++
一旦miss大于dirty的長度,就會觸發dirty到readonly的升級(這塊還挺復雜,需要再看看)
因為讀read不用上鎖,所以當然是到read里更好
sync.map總體來說是在寫完一次多讀的情況下使用比較好,以及不同協程對不同鍵的讀寫情況下使用比較好