互斥锁(sync.Mutex)和 读写锁(sync.RWMutex)
互斥锁
互斥锁是一种常用的控制共享资源访问的方法,它能够保证同时只有一个 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 ~