• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

GO 锁

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

不加锁

package main

import (
    "fmt"
    "sync"
)

var x=0
var wg107 sync.WaitGroup

func add1() {
    for i := 0; i < 50000; i++ {
        x += 1
    }
    wg107.Done()
}


func test1() {
    wg107.Add(2)
    go add1()
    go add1()
    wg107.Wait()
    fmt.Println("Done ~", x)
}


func main() {
    test1()
}

执行1:Done ~ 59534

执行2:Done ~ 50243

可以看出每次执行结果不一,原因:共有变量x,没加锁,导致可能同时获取到加1,导致只加了1次

互斥锁

package main

import (
    "fmt"
    "sync"
)

var x=0
var wg107 sync.WaitGroup
var lock sync.Mutex


func add2() {
    for i := 0; i < 50000; i++ {
        lock.Lock()
        x += 1
        lock.Unlock()
    }
    wg107.Done()
}

func test2() {
    wg107.Add(2)
    go add2()
    go add2()
    wg107.Wait()
    fmt.Println("Done ~", x)
}

func main() {
    test2()
}

读写互斥锁

package main

import (
    "fmt"
    "sync"
    "time"
)

var x = 0
var wg107 sync.WaitGroup

var rwlock sync.RWMutex

func read() {
    defer wg107.Done()
    rwlock.RLock()
    time.Sleep(time.Millisecond)
    rwlock.RUnlock()
}

func write() {
    defer wg107.Done()
    rwlock.Lock()
    time.Sleep(time.Millisecond * 10)
    rwlock.Unlock()
}

func test3() {
    start := time.Now()
    for i := 0; i < 10; i++ {
        wg107.Add(1)
        go write()
    }
    for i := 0; i < 100; i++ {
        wg107.Add(1)
        go read()
    }
    wg107.Wait()
    fmt.Println(time.Now().Sub(start))
}

func main() {
    test3()
}

执行:

111.770703ms

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
go context发布时间:2022-07-10
下一篇:
Go的优雅终止姿势发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap