a. import(“sync”)
b. 互斥鎖, var mu sync.Mutex (只有一個釋放之后,下一個才能進(jìn)去)(sync.Mutex類型只有兩個公開的指針方法:Lock、Unlock)
c. 讀寫鎖, var mu sync.RWMutex(讀不鎖,只有寫才鎖)
d.原子鎖,import "sync/atomic"
創(chuàng)新互聯(lián)是專業(yè)的船營網(wǎng)站建設(shè)公司,船營接單;提供成都網(wǎng)站設(shè)計、成都做網(wǎng)站,網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行船營網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊,希望更多企業(yè)前來合作!
比如map,文件等被多個goroutine修改,則要做好鎖。
只讀無需加鎖
用go build -race xxx.go來編譯,并運行二進(jìn)制文件來查看競爭關(guān)系
互斥鎖舉例:
a := make(map[int]int, 5)
a[0] = 10
fmt.Println(a)
for i := 0; i < 2; i++ {
go func(b map[int]int){
//設(shè)置互斥鎖
lock.Lock()
a[0] = rand.Intn(100)
lock.Unlock()
}(a)
}
//互斥鎖不讀還是寫,都要設(shè)置才能確保不競爭
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)
//輸出原子鎖次數(shù)也要有固定寫法
fmt.Println(atomic.LoadInt32(&count))
}
分享標(biāo)題:鎖/競爭(互斥鎖、讀寫鎖、原子鎖)
URL網(wǎng)址:http://jinyejixie.com/article22/pochcc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號、網(wǎng)站排名、商城網(wǎng)站、建站公司、App設(shè)計、做網(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)