一個(gè)資源,如果需要多個(gè)接口去訪問,那么需要進(jìn)行加鎖,
但是這個(gè)鎖在不同的場景下面是需要加不同的鎖的, 如果胡亂加鎖,那么就會(huì)造成程序運(yùn)行緩慢
線程同步加鎖必要的標(biāo)準(zhǔn)庫包是sync
一般情況有兩種鎖,一種是互斥鎖, 一種是讀寫鎖,其中加了互斥鎖的程序性能比讀寫鎖的性能要低200倍
互斥鎖, var mu sync.Mutex``讀和寫頻率一樣的場景
讀寫鎖, var mu sync.RWMutex 讀多寫少的場景
互斥鎖
一個(gè)資源,如果需要多個(gè)接口去訪問,那么需要進(jìn)行加鎖,但是這個(gè)鎖適合的場景是,
讀和寫頻率一樣的場景,因?yàn)闀?huì)影響性能
舉例:
var hLock sync.Mutex;
func main() {
ch := make(chan int)
for i := 0; i < 10; i++ {
go test(ch, i)
}
for i := 0; i < 10; i++ {
<-ch
}
}
func test(ch chan int, i int) {
hLock.Lock()
f[0] =byte(i)
fmt.Println(f)
ch <- i
hLock.Unlock()
}
讀寫鎖
一個(gè)資源,如果需要多個(gè)接口去訪問,那么需要進(jìn)行加鎖,但是這個(gè)鎖適合的場景是,
讀多寫少的場景,
舉例好比教室里面的黑板, 全班的同學(xué)都可以讀黑板, 但是能夠改變黑板上面的文字只有老師一個(gè)人,
那么如果有兩個(gè)老師同時(shí)更改黑板內(nèi)容的時(shí)候,就會(huì)造成同學(xué)們無法確定該讀誰寫的文字
因此其中一個(gè)老師在黑板上書寫文字內(nèi)容的時(shí)候, 需要把這一過程上鎖,
一旦上了讀寫鎖,那么第二個(gè)老師只能等待第一個(gè)老師書寫完畢才可以進(jìn)行書寫
舉例:
var rwLock sync.RWMutex;
func main() {
// hLock := sync.Locker
ch := make(chan int)
for i := 0; i < 10; i++ {
go test(ch, i)
}
for i := 0; i < 10; i++ {
<-ch
}
}
func test(ch chan int, i int) {
rwLock.RLock()
f[0] =byte(i)
fmt.Println(f)
fmt.Println(f)
fmt.Println(f)
fmt.Println(f)
fmt.Println(f)
ch <- i
rwLock.RUnlock()
}