互斥锁
互斥锁是一种常用的控制共享资源访问的方法,它能够保证同时只有一个 goroutine 可以访问到共享资源
demo:开启 3 个 goroutine 进行累加,输出最终结果和耗时
package main
import (
"fmt"
"sync"
"time"
)
var (
count int
status int
//互斥锁
countGuard sync.Mutex
)
func accumulator() {
for i := 0; i < 10000000; i++ {
countGuard.Lock()
count += 1
countGuard.Unlock()
}
status += 1
}
func main() {
var num int = 3
//统计用时
startTime := time.Now().UnixNano() / 1e6
for i := 0; i < num; i++ {
go accumulator()
}
//不让main中的 goroutine 停止
for {
if status == num {
endTime := time.Now().UnixNano() / 1e6
useTime := endTime - startTime
fmt.Printf("最终累加结果:%d\n耗时:%d ms\n", count, useTime)
break
}
}
}
运行结果:
最终累加结果:30000000
耗时:2197 ms
读写锁
在读多写少的环境中,可以优先使用读写互斥锁(sync.RWMutex),它比互斥锁更加高效。sync 包中的 RWMutex 提供了读写互斥锁的封装
package main
import (
"fmt"
"sync"
"time"
)
var (
count int
status int
//互斥锁
countGuard sync.RWMutex
)
func accumulator() {
for i := 0; i < 10000000; i++ {
countGuard.Lock()
count += 1
countGuard.Unlock()
}
status += 1
}
func main() {
var num int = 3
//统计用时
startTime := time.Now().UnixNano() / 1e6
for i := 0; i < num; i++ {
go accumulator()
}
//不让main中的 goroutine 停止
for {
if status == num {
endTime := time.Now().UnixNano() / 1e6
useTime := endTime - startTime
fmt.Printf("最终累加结果:%d\n耗时:%d ms\n", count, useTime)
break
}
}
}
end ~
Go 互斥锁(sync.Mutex)和 读写锁(sync.RWMutex)
原文:https://www.cnblogs.com/kaichenkai/p/11108303.html