1. 程式人生 > 其它 >go基礎知識-鎖

go基礎知識-鎖

var(
//併發任務同步
_syncGp sync.WaitGroup
//載入一次
_syncOnce sync.Once
//sync.Map
_syncMap sync.Map
//互斥鎖
_lock sync.Mutex
//讀寫互斥鎖
_rdLock sync.RWMutex
)

func main(){
var x int
_syncGp.Add(1)
//互斥鎖
go func() {
for j:=0;j<100;j++ {
_lock.Lock()
x = x + 1
_lock.Unlock()
}
_syncGp.Done()
}()

_syncGp.Add(3)
var y int64
//讀寫互斥
go func() {
for i :=0 ;i<100;i++ {
_rdLock.Lock()
y = y + 1
_rdLock.Unlock()
}
_syncGp.Done()
}()
//讀鎖
go func() {
_rdLock.RLock()
fmt.Println("讀取y=",y)
_rdLock.RUnlock()
_syncGp.Done()
}()

//原子鎖
go func() {
atomic.AddInt64(&y,1)
_syncGp.Done()
}()

//執行一次
_syncOnce.Do(func() {
fmt.Println("載入一次")
})

_syncGp.Add(1)
//sync.Map
go func() {
for i:=0;i<5;i++{
_syncGp.Add(1)
go func(j int) {
key := strconv.Itoa(j)
_syncMap.Store(key,j)
data,_ := _syncMap.Load(key)
fmt.Printf("k=:%v,v:=%v\n", key, data)
_syncGp.Done()
}(i)
}
_syncGp.Done()
}()

_syncGp.Wait()
fmt.Println("x=",x)
fmt.Println("yy=",y)
}