• 微信公众号:美女很有趣。 工作之余,放松一下,关注即送10G+美女照片!

Golang网课-比较互斥锁与读写互斥锁的耗时

开发技术 开发技术 3天前 6次浏览

一、读写锁(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
}

可以看到,相比于简单的加入互斥锁,读写锁拥有更高的速度与性能优势


程序员灯塔
转载请注明原文链接:Golang网课-比较互斥锁与读写互斥锁的耗时
喜欢 (0)