sync是go的基礎(chǔ)包之一柄驻,也是使用比較頻繁的县习,經(jīng)常用做并發(fā)控制掘而,goroutine機(jī)制會(huì)有大量并發(fā)情況,而數(shù)據(jù)在大并發(fā)下如果沒(méi)有鎖控制會(huì)導(dǎo)致數(shù)據(jù)無(wú)法保證安全鹏漆,因此就需要用到鎖機(jī)制來(lái)保證數(shù)據(jù)一致性巩梢,sync包就提供了相應(yīng)的方法。
互斥鎖Mutex
提供了兩個(gè)方法 Lock() 和Unlock() 加鎖和解鎖艺玲。一個(gè)互斥鎖只能同時(shí)被一個(gè) goroutine 鎖定括蝠,其它 goroutine 將阻塞直到互斥鎖被解鎖,之后再重新?tīng)?zhēng)搶對(duì)互斥鎖的鎖定饭聚。這個(gè)就是排它鎖忌警。對(duì)一個(gè)未鎖定的互斥鎖解鎖將會(huì)產(chǎn)生運(yùn)行時(shí)錯(cuò)誤
讀寫(xiě)鎖RwMutex
提供四個(gè)方法
Lock() Unlock()? Rlock() RUnlock()
讀寫(xiě)鎖是針對(duì)讀寫(xiě)操作的互斥鎖,讀寫(xiě)鎖與互斥鎖最大的不同就是可以分別對(duì) 讀若治、寫(xiě) 進(jìn)行鎖定慨蓝。一般用在大量讀操作感混、少量寫(xiě)操作的情況。
這幾個(gè)方法都是成對(duì)出現(xiàn)的礼烈,lock對(duì)應(yīng)unlock弧满, rlock對(duì)應(yīng)runlock,不能互相混淆
WaitGroup
WaitGroup 用于等待一組 goroutine 結(jié)束? 共有三個(gè)方法 Add() Done() Wait() 內(nèi)部實(shí)現(xiàn)類似計(jì)數(shù)器功能此熬,當(dāng)創(chuàng)建一個(gè)goroutine 計(jì)數(shù)器加一庭呜,銷毀的時(shí)候計(jì)數(shù)器減一,在主函數(shù)層用Wait方法阻塞犀忱,當(dāng)計(jì)數(shù)器等于零時(shí)募谎,說(shuō)明goroutine都已銷毀,程序結(jié)束阴汇。注意Add方法要在創(chuàng)建goroutine之前調(diào)用数冬。
Once
Once 是一個(gè)可以被多次調(diào)用但是只執(zhí)行一次,若每次調(diào)用Do時(shí)傳入?yún)?shù)f不同搀庶,但是只有第一個(gè)才會(huì)被執(zhí)行,可以用來(lái)做初始化或者單例模式
sync包的鎖機(jī)制和這些方法拐纱,底層實(shí)現(xiàn)都是通過(guò)atomic 這個(gè)包里的方法來(lái)實(shí)現(xiàn)的,下一篇文章就來(lái)分析下atomic這個(gè)包