一個資源,如果需要多個接口去訪問,那么需要進行加鎖,
但是這個鎖在不同的場景下面是需要加不同的鎖的, 如果胡亂加鎖,那么就會造成程序運行緩慢
線程同步加鎖必要的標準庫包是sync
一般情況有兩種鎖,一種是互斥鎖, 一種是讀寫鎖,其中加了互斥鎖的程序性能比讀寫鎖的性能要低200倍
互斥鎖, var mu sync.Mutex``讀和寫頻率一樣的場景
讀寫鎖, var mu sync.RWMutex
讀多寫少的場景
互斥鎖
一個資源,如果需要多個接口去訪問,那么需要進行加鎖,但是這個鎖適合的場景是,
讀和寫頻率一樣的場景
,因為會影響性能
舉例:
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()
}
讀寫鎖
一個資源,如果需要多個接口去訪問,那么需要進行加鎖,但是這個鎖適合的場景是,
讀多寫少的場景
,
舉例好比教室里面的黑板, 全班的同學都可以讀黑板, 但是能夠改變黑板上面的文字只有老師一個人,
那么如果有兩個老師同時更改黑板內容的時候,就會造成同學們無法確定該讀誰寫的文字
因此其中一個老師在黑板上書寫文字內容的時候, 需要把這一過程上鎖,
一旦上了讀寫鎖,那么第二個老師只能等待第一個老師書寫完畢才可以進行書寫
舉例:
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()
}