18 并发安全

18 并发安全

1. mutex

​ 使用sync.Mutex设置锁,来保证临界区内只有一个协程访问。

// Package main -----------------------------
// @file : safe.go
// @author : Yunyin
// @contact : yunyin_jayyi@qq.com
// @time : 2023/7/30 15:23
// -------------------------------------------
package main

import (
"fmt"
"sync"
)

var lock = sync.Mutex{}
var n int32

func foo() {
for i := 0; i < 100000; i++ {
lock.Lock()
n++
lock.Unlock()

}
fmt.Println("n=", n)
}

func main() {
wg := sync.WaitGroup{}
wg.Add(2)
for i := 0; i < 2; i++ {
go func() {
defer wg.Done()
foo()
}()
}
wg.Wait()
fmt.Println("MAIN n=", n)
}

2. atomic

atomic.AddInt32用于原子操作。

// Package main -----------------------------
// @file : safe.go
// @author : Yunyin
// @contact : yunyin_jayyi@qq.com
// @time : 2023/7/30 15:23
// -------------------------------------------
package main

import (
"fmt"
"sync"
"sync/atomic"
)

var n int32

func foo() {
for i := 0; i < 100000; i++ {
atomic.AddInt32(&n, 1)
}
fmt.Println("n=", n)
}

func main() {
wg := sync.WaitGroup{}
wg.Add(2)
for i := 0; i < 2; i++ {
go func() {
defer wg.Done()
foo()
}()
}
wg.Wait()
fmt.Println("MAIN n=", n)
}