Golang网课-比较互斥锁与读写互斥锁的耗时
一、读写锁(hello.go)
package main import ( "fmt" "sync" "time" ) var ( x int64 wg sync.WaitGroup rwlck sync.RWMutex //读写锁类型变量 ) func write() { defer wg.Done() rwlck.Lock() //写锁 x = x + 1 time.Sleep(time.Millisecond * 10) //写操作:10ms rwlck.Unlock() //解写锁 } func read() { defer wg.Done() rwlck.RLock() //读锁 time.Sleep(time.Millisecond) //读操作:1ms rwlck.RUnlock() //解读锁 } func main() { start := time.Now() for i := 0; i < 10; i++ { wg.Add(1) go write() } for i := 0; i < 100; i++ { wg.Add(1) go read() } end := time.Now() fmt.Println(end.Sub(start)) //平均耗时约 0.5 ms }
二、互斥锁(world.go)
package main import ( "fmt" "sync" "time" ) var ( x int64 wg sync.WaitGroup lck sync.Mutex ) func write() { defer wg.Done() lck.Lock() //加互斥锁 x = x + 1 time.Sleep(time.Millisecond * 10) //写操作耗时 10 毫秒 lck.Unlock() //解锁 } func read() { defer wg.Done() lck.Lock() time.Sleep(time.Millisecond) //读操作耗时 1 毫秒 lck.Unlock() } func main() { start := time.Now() for i := 0; i < 10; i++ { wg.Add(1) go write() } for i := 0; i < 100; i++ { wg.Add(1) go read() } wg.Wait() end := time.Now() fmt.Println(end.Sub(start)) //平均耗时约 1.75 s }
可以看到,相比于简单的加入互斥锁,读写锁拥有更高的速度与性能优势

浙公网安备 33010602011771号