golang處理高併發,保證線性安全的各種方式
package main
import (
"fmt"
"sync"
"sync/atomic"
)
func main() {
var num int64
var wg sync.WaitGroup
for i := 0; i < 1000; i ++ {
wg.Add(1)
go func() {
defer wg.Done()
atomic.AddInt64(&num, 1)
}()
}
wg.Wait()
fmt.Println(num)
}
func main() {
var num int
var wg sync.WaitGroup
var ch = make(chan bool, 1)
for i:=0; i<1000; i++ {
wg.Add(1)
go func() {
defer wg.Done()
ch <- true
num ++
<-ch
}()
}
wg.Wait()
fmt.Println(num)
}
func main() {
var num int
var mutex sync.Mutex
var wg sync.WaitGroup
for i:=0; i<100000; i++ {
wg.Add(1)
go func() {
defer wg.Done()
defer mutex.Unlock()
mutex.Lock()
num ++
}()
}
wg.Wait()
fmt.Println(num)
}