您好,登錄后才能下訂單哦!
a. import(“sync”)
b. 互斥鎖, var mu sync.Mutex (只有一個釋放之后,下一個才能進去)(sync.Mutex類型只有兩個公開的指針方法:Lock、Unlock)
c. 讀寫鎖, var mu sync.RWMutex(讀不鎖,只有寫才鎖)
d.原子鎖,import "sync/atomic"
比如map,文件等被多個goroutine修改,則要做好鎖。
只讀無需加鎖
用go build -race xxx.go來編譯,并運行二進制文件來查看競爭關系
互斥鎖舉例:
a := make(map[int]int, 5)
a[0] = 10
fmt.Println(a)
for i := 0; i < 2; i++ {
go func(b map[int]int){
//設置互斥鎖
lock.Lock()
a[0] = rand.Intn(100)
lock.Unlock()
}(a)
}
//互斥鎖不讀還是寫,都要設置才能確保不競爭
lock.Lock()
fmt.Println(a)
lock.Unlock()
讀寫鎖(包括原子鎖)舉例:
package main
import (
"sync"
"fmt"
"math/rand"
"time"
"sync/atomic"
)
var rwLock sync.RWMutex
func main() {
var count int32
//讀寫鎖
a := make(map[int]int, 5)
a[0] = 10
fmt.Println(a)
for i := 0; i < 2; i++ {
go func(b map[int]int){
//寫的鎖是Lock
rwLock.Lock()
a[0] = rand.Intn(100)
rwLock.Unlock()
}(a)
}
for i := 0; i < 100; i++ {
go func(b map[int]int){
//讀的鎖是RLock
rwLock.RLock()
fmt.Println(a)
//原子鎖引用賦值count,每次加一
atomic.AddInt32(&count, 1)
rwLock.RUnlock()
}(a)
}
time.Sleep(time.Second)
//輸出原子鎖次數也要有固定寫法
fmt.Println(atomic.LoadInt32(&count))
}
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。