sync.Map是1.9才推薦的并發(fā)安全的map,除了互斥量以外,還運用了原子操作,所以在這之前,有必要了解下 Go語言——原子操作
成都創(chuàng)新互聯(lián)公司專注于企業(yè)成都營銷網(wǎng)站建設(shè)、網(wǎng)站重做改版、霍山網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、html5、商城系統(tǒng)網(wǎng)站開發(fā)、集團公司官網(wǎng)建設(shè)、外貿(mào)營銷網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為霍山等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
go1.10\src\sync\map.go
entry分為三種情況:
從read中讀取key,如果key存在就tryStore。
注意這里開始需要加鎖,因為需要操作dirty。
條目在read中,首先取消標(biāo)記,然后將條目保存到dirty里。(因為標(biāo)記的數(shù)據(jù)不在dirty里)
最后原子保存value到條目里面,這里注意read和dirty都有條目。
總結(jié)一下Store:
這里可以看到dirty保存了數(shù)據(jù)的修改,除非可以直接原子更新read,繼續(xù)保持read clean。
有了之前的經(jīng)驗,可以猜測下load流程:
與猜測的 區(qū)別 :
由于數(shù)據(jù)保存兩份,所以刪除考慮:
先看第二種情況。加鎖直接刪除dirty數(shù)據(jù)。思考下貌似沒什么問題,本身就是臟數(shù)據(jù)。
第一種和第三種情況唯一的區(qū)別就是條目是否被標(biāo)記。標(biāo)記代表刪除,所以直接返回。否則CAS操作置為nil。這里總感覺少點什么,因為條目其實還是存在的,雖然指針nil。
看了一圈貌似沒找到標(biāo)記的邏輯,因為刪除只是將他變成nil。
之前以為這個邏輯就是簡單的將為標(biāo)記的條目拷貝給dirty,現(xiàn)在看來大有文章。
p == nil,說明條目已經(jīng)被delete了,CAS將他置為標(biāo)記刪除。然后這個條目就不會保存在dirty里面。
這里其實就跟miss邏輯串起來了,因為miss達(dá)到閾值之后,dirty會全量變成read,也就是說標(biāo)記刪除在這一步最終刪除。這個還是很巧妙的。
真正的刪除邏輯:
很繞。。。。
不會釋放value,僅僅標(biāo)記為不可用,但實際內(nèi)存還是在占用
package?main
import?(
"log"
"runtime"
)
var?intMap?map[int]int
var?cnt?=?8192
func?main()?{
printMemStats()
initMap()
runtime.GC()
printMemStats()
log.Println(len(intMap))
for?i?:=?0;?i??cnt;?i++?{
delete(intMap,?i)
}
log.Println(len(intMap))
runtime.GC()
printMemStats()
intMap?=?nil
runtime.GC()
printMemStats()
}
func?initMap()?{
intMap?=?make(map[int]int,?cnt)
for?i?:=?0;?i??cnt;?i++?{
intMap[i]?=?i
}
}
func?printMemStats()?{
var?m?runtime.MemStats
runtime.ReadMemStats(m)
log.Printf("Alloc?=?%v?TotalAlloc?=?%v?Sys?=?%v?NumGC?=?%v\n",?m.Alloc/1024,?m.TotalAlloc/1024,?m.Sys/1024,?m.NumGC)
}
隨便怎么寫啊,共享內(nèi)存獲取到不是給你一個內(nèi)存地址,這里稱之為des么,直接通過des地址訪問啊,比如你要寫2個結(jié)構(gòu)體進(jìn)去,第一個memcpy寫到des,第二個可以(memcpy到des+結(jié)構(gòu)體大?。┑牡刂分赶虻膬?nèi)存上,
新聞名稱:go語言delete,go語言的類
分享網(wǎng)址:http://www.rwnh.cn/article26/dssojcg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、服務(wù)器托管、企業(yè)網(wǎng)站制作、自適應(yīng)網(wǎng)站、微信公眾號、靜態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)